找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1719|回复: 8
收起左侧

STM32程序中IIC做从机接收数据第9个CLK应该是发送ACK,结果是NAK

[复制链接]
ID:137662 发表于 2023-1-11 17:19 | 显示全部楼层 |阅读模式
STM32程序中IIC做从机接收数据第9个CLK应该是发送ACK,结果是NAK。接收很多数据,一开始的数据都很正常,会出现几次数据发送NAK的现象。通过逻辑分析仪抓取数据如下:

IICNAK.JPG
回复

使用道具 举报

ID:137662 发表于 2023-1-11 17:24 | 显示全部楼层
各位帮忙看一下,上面项目中的IIC程序接收函数是否有问题,经常是在第9个CLK时出问题,本意是希望发送ACK(SDA为0),结果发送成高电平(SDA为1),结果与程序不符合,不知道是哪的问题,帮忙看一下,谢谢!

IIC程序接收函数是否有问题

IIC程序接收函数是否有问题
回复

使用道具 举报

ID:1034262 发表于 2023-1-12 11:43 | 显示全部楼层
你设置的问题吧?I2C通信,不管主机还是从机,总是接收方发出应答。
回复

使用道具 举报

ID:137662 发表于 2023-1-12 16:51 | 显示全部楼层
coody_sz 发表于 2023-1-12 11:43
你设置的问题吧?I2C通信,不管主机还是从机,总是接收方发出应答。

谢谢您的回答,我是GPIO模拟的IIC,硬件上两个IO口都分别上拉10kΩ的电阻,配置为推挽输出,我的疑惑的地方是实际中也不全是NAK,有时很正常,回复的都是ACK,但有时应答几个ACK后就出现NAK,造成后面的数据乱了,但重新上电可能就全是ACK了,有种不稳定的感觉。
回复

使用道具 举报

ID:137662 发表于 2023-1-12 16:54 | 显示全部楼层
以下是配置代码,我是用GPIO 模拟的IIC,硬件上上拉10k电阻,我的疑惑i点在于有时通信正常,全都能回复ACK,但有时就在应答几个ACK后会出现NAK,造成后面紊乱了,重新上电重新测试又好了,有种不稳定的感觉。
IIC配置.JPG
回复

使用道具 举报

ID:401564 发表于 2023-1-13 08:58 | 显示全部楼层
蜗牛的贝壳 发表于 2023-1-12 16:54
以下是配置代码,我是用GPIO 模拟的IIC,硬件上上拉10k电阻,我的疑惑i点在于有时通信正常,全都能回复ACK ...

咱就想问一下,能不能C+V复制代码上来呢?别人想帮你,就可以自己仿真或者运行一下
你截图,别人还得一个一个字母的打出来呢.....
回复

使用道具 举报

ID:137662 发表于 2023-1-13 14:04 | 显示全部楼层
Y_G_G 发表于 2023-1-13 08:58
咱就想问一下,能不能C+V复制代码上来呢?别人想帮你,就可以自己仿真或者运行一下
你截图,别人还得一 ...

好,多谢。
void i2c_slave_port_init( void )
{
                GPIO_InitTypeDef  GPIO_InitStructure;
                /*************************GPIO*******************/
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14| GPIO_Pin_15 ;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        //        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
                GPIO_Init(GPIOB, &GPIO_InitStructure);               
                I2C_SCL_H();
                I2C_SDA_H();               
                I2C_SDA_IN_SET();  //20230104
                 I2C_SCL_IN_SET();
}

static u8 ucI2C_recv_nmlbyte(void)
{
        volatile u8 i, tmp;   //11.30DT¸Ä
        tmp = 0x00;
        I2C_SDA_IN_SET();
        WaitIIC_SCLDown();
        for(i=0;i<8;i++)
        {       
                WaitIIC_SCLUp();
                tmp<<=1;       
                if(I2C_SDA_IN())
                tmp++;
               WaitIIC_SCLDown();
        }
              WaitIIC_SCLDown();
              Delay_us(2);  //¼óÑóê±
              I2C_SDA_OUT_SET();
                I2C_SDA_L();
             WaitIIC_SCLUp();
            WaitIIC_SCLDown();
            return tmp;
}
回复

使用道具 举报

ID:401564 发表于 2023-1-13 21:46 | 显示全部楼层
蜗牛的贝壳 发表于 2023-1-13 14:04
好,多谢。
void i2c_slave_port_init( void )
{

真的无语了..........
我把我写的IIC发给你吧,自己对比一下吧
iic_stm32.rar (2.25 KB, 下载次数: 10)
回复

使用道具 举报

ID:84492 发表于 2024-9-4 22:02 | 显示全部楼层
51模拟IIC从机,发现ACK这部分应该是错的,虽然总线上看到都是应答了但接收除第一个地址数据外,其他是错的,弄了两天还是没找到原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表