问答

汇集网友智慧,解决技术难题

lhsls01

TA的家园币:10  

  • ch32v103 c8t6 如何支持中断发送

    hi,我根据https://bbs.21ic.com/icview-3141094-1-1.htmlsample代码,可以实现从机接收。(主机为RK3566,从机CH32V103)即主机可以i2c_write成功。但如果调用i2c_read,则ch32v103会一直拉低I2CCLK线,CH32只产生了三个中断,最后一个中断报ACKFAILED。intR1:2R2:2,TxCount:0intR1:82R2:6,TxCount:0errorint:4806I2C_IT_AF出现以上问题后,必须复位CH32V103才会使I2CCLK线重新拉高。请问是否有中断从机发的samplecode.目前代码如下://下述中断程序中,当主机读取和写入数据时,都会引起地址位被置位,即发生EV1事件(即本中断处理程序中将发送和接收的EV1合并了);//当主机写入数据时,中断的执行顺序是EV1―>EV2―>EV4,其中有多个数据EV2会多次执行;//当主机读取数据时,中断的执行顺序是EV1―>EV3―>EV3-2,本中断程序中将EV3和EV3-1合并了,若有多个数据,EV3将多次执行。//本程序只进行从机中断接收//事件中断处理函数voidI2C1_EV_IRQHandler(void){uint16_tSTAR1Register,STAR2Register;inti=0;u8rcv=0;//状态寄存器1和状态寄存器2对应值STAR1Register=I2C1->STAR1;STAR2Register=I2C1->STAR2;printf("intR1:%xR2:%x,TxCount:%d\r\n",STAR1Register,STAR2Register,TxCount);//I2C从机(MSL=0)//若状态寄存器2的位0不为1,即为0,则代表从模式(1代表主模式)if((STAR2Register&0x0001)==0x0000){//从机发送数据发送数据(TxE=1:EV3、EV3-1)//从模式下,若状态寄存器1位7TxE位为1,则数据寄存器空if((STAR1Register&0x0080)==0x0080){I2C1->DATAR=TxData[TxCount];//printf("Tx:Wreg:%x\r\n",TxData[TxCount]);TxCount++;STAR1Register=0;STAR2Register=0;//RxData[RxCount]=I2C1->DATAR;}//从模式下,若状态寄存器1位1ADDR的位为1,收到的地址匹配,即主机已发送地址,地址为被置位・(ADDR=1:EV1(包括发送和接收))if(STAR1Register&0x0002){//清除相应值STAR1Register=0;STAR2Register=0;RxCount=0x00;TxCount=0x00

    I2c CH32V103 从机

    2022-06-22 0