求助:ai8051u的i2c DMA 在读取最后一个字节后是否会自动发送nak
如题:芯片手册没有提到是否会自动发送NAK,但是按理说有计数器的情况下它应该是能自动发送的,
这样我就不用手动读取最后一字节并发送NAK干预了
手册没有描述
可能调整了相关设计
毕竟硬件IIC有关系到专利 找个芯片测了一下,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;
} 乘风飞扬 发表于 2026-6-29 14:07
找个芯片测了一下,I2C使用DMA读完数据最后一个字节,是会自动发送NAK
ok,感谢{:4_201:}
页:
[1]