zmjjkk 发表于 2026-6-28 16:39:22

求助:ai8051u的i2c DMA 在读取最后一个字节后是否会自动发送nak

如题:芯片手册没有提到是否会自动发送NAK,
但是按理说有计数器的情况下它应该是能自动发送的,
这样我就不用手动读取最后一字节并发送NAK干预了

狂热主宰 发表于 2026-6-28 22:16:12

手册没有描述
可能调整了相关设计
毕竟硬件IIC有关系到专利

乘风飞扬 发表于 2026-6-29 14:07:39

找个芯片测了一下,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;
}

zmjjkk 发表于 2026-6-30 10:02:26

乘风飞扬 发表于 2026-6-29 14:07
找个芯片测了一下,I2C使用DMA读完数据最后一个字节,是会自动发送NAK

ok,感谢{:4_201:}
页: [1]
查看完整版本: 求助:ai8051u的i2c DMA 在读取最后一个字节后是否会自动发送nak