野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1364|回复: 3

指南者IIC硬件读写疑问,望大佬帮忙看一看

[复制链接]
发表于 2023-9-13 23:48:34 | 显示全部楼层 |阅读模式



疑问点就在下面这个读字节内容里:
问题:这部分内容是正常写入过程,但是当把<<printf("原始代码!!\r\n");>>这条语句删除,测试过程就不正常了       
void I2C_EEPROM_ReadByte(I2C_TypeDef* I2Cx,uint8_t addr,uint8_t *data)
{
       
#if 1
        /***********原始代码,无法顺利读取,读取过程卡死状态,按键复位也无效***********/
        printf("原始代码!!\r\n");       
        //发送起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
        //printf("起始信号发送正常!!\r\n");
        //发送设备地址
        I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Transmitter);
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);

        printf("地址信号发送正常!!\r\n");
        I2C_Cmd(I2Cx, ENABLE);
       
        //发送地址数据
        I2C_SendData(I2Cx, addr);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
        //printf("地址方向写入OK!!\n");

        //发送起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
        //发送设备地址
        I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Receiver);
        //printf("读取地址方向成功到达!!\n");
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS);
        //检测EV7事件
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);

        //非应答
        I2C_AcknowledgeConfig(I2Cx,DISABLE);
       
        //发送停止位
        I2C_GenerateSTOP(I2Cx, ENABLE);
       
        //读取数据
        *data = I2C_ReceiveData(I2Cx);
        printf("接收事件完成!!\n");
        //重新使能
        I2C_AcknowledgeConfig(I2Cx,ENABLE);
}

正常的写函数如下:

//单字节写入
void I2C_EEPROM_WriteByte(I2C_TypeDef* I2Cx,uint8_t addr,uint8_t *data)
{
        //printf("写字节数据开始!!\r\n");
        //发送起始信号
        I2C_GenerateSTART(I2Cx, ENABLE);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
        //printf("写起始发送正常!!\r\n");
        //发送设备地址
        I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Transmitter);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
        //printf("写地址发送完毕!!\r\n");
        //发送字地址
        I2C_SendData(I2Cx, addr);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
        //printf("写地址地址数据正常!!\r\n");
        //发送数据

        I2C_SendData(I2Cx, *data);
       
        while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
        //printf("写数据完毕!!\r\n");
        //发送停止位
        I2C_GenerateSTOP(I2Cx, ENABLE);

}

主函数部分如下:

int main(void)
{

        uint8_t ReadData = 0;
        uint8_t WriteData = 0x55;
        GPIO_LED_Config();


        USART_Config();
        IIC_EE_Config();
       
        printf("往EEPROM里写入了一个字节数据\n");
        I2C_EEPROM_WriteByte(IIC1_PORT,1,&WriteData);
        LED_G;
        IIC_Query_EEPROM_State(IIC1_PORT);
        LED_B;
        I2C_EEPROM_ReadByte(IIC1_PORT,1,&ReadData);
        printf("从EEPROM读取到的数据为:0x%x\r\n\r\n",ReadData);
        LED_R;

        while(1)
        {
               
        }
       
        return 0;
}


其他配置和野火资料一样
       
       

回复

使用道具 举报

发表于 2023-9-15 08:42:00 | 显示全部楼层
加个延时看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-15 12:40:22 | 显示全部楼层

加延时确实是会有效,并且我把可能会有冲突的中断组都重新进行了等级排序,只是不明白,为什么去除这些串口通信后,程序就会卡死,一种情况是上电复位后正常执行完一次,按键复位后程序卡死在写操作的起始信号检测处,另一种情况则是上电复位时,程序就会卡死在读取部分的第一个写地址检测处
回复 支持 反对

使用道具 举报

发表于 2023-10-9 10:12:25 | 显示全部楼层
1.printf语句使用串口进行输出是需要时间的,等同于延时函数,具体时间与你串口的波特率相关;
2.为什么加了延时有用,可能是EEPROM写操作后,需要等待一段时间,再去写入下一个数据.你可以参考这个链接https://blog.csdn.net/weixin_43850409/article/details/115432557
野火论坛202310091011072403..png
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 21:18 , Processed in 0.127278 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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