找个芯片测了一下,I2C使用DMA读完数据最后一个字节,是会自动发送NAK
- void ReadNbyte(u8 addr, u8 number) /* WordAddress,First Data Address,Byte lenth */
- {
- while(I2CMSST & 0x80); //检查I2C控制器忙碌状态
- DMA_I2C_CR = 0x00;
- I2CMSST = 0x00;
-
- //发送起始信号+设备地址+写信号
- I2CTXD = SLAW;
- I2CMSCR = 0x09;
- while ((I2CMSST & 0x40) == 0);
- I2CMSST = 0x00;
-
- //发送存储器地址
- I2CTXD = addr;
- I2CMSCR = 0x0a;
- while ((I2CMSST & 0x40) == 0);
- I2CMSST = 0x00;
-
- //发送起始信号+设备地址+读信号
- I2CTXD = SLAR;
- I2CMSCR = 0x09;
- while ((I2CMSST & 0x40) == 0);
- I2CMSST = 0x00;
-
- DmaRxFlag = 1;
- //触发数据读取命令
- I2CMSCR = 0x8b;
- DMA_I2C_CR = 0x01;
-
- DMA_I2CR_AMT = number-1; //设置传输总字节数(低8位):n+1
- DMA_I2CR_AMTH = 0x00; //设置传输总字节数(高8位):n+1
- DMA_I2C_ST1 = number-1; //设置需要传输字节数(低8位):number + 设备地址 + 存储地址
- DMA_I2C_ST2 = 0x00; //设置需要传输字节数(高8位):n+1
- DMA_I2CR_CR |= 0x40; //bit7 1:使能 I2CR_DMA, bit6 1:开始 I2CR_DMA, bit0 1:清除 FIFO
- while(DmaRxFlag); //DMA忙检测
- DMA_I2C_CR = 0x00;
- }
复制代码
|