打印
[嵌入式linux]

stm32f103 i2c读写at24c04问题

[复制链接]
1271|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq583678156|  楼主 | 2020-3-29 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用stm32f103 自带的库函数i2c读写at24c04,写数据没有问题,但是读数据不知道是哪个地方设置不对??只能读一次,读数据之后不能继续读和写了。请帮忙看下是读数据函数哪个地方有问题呢???,程序如下:
//i2c1写数据,在芯片的0x01写入值为4的数据
void I2C1H_Send_data()
{
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)==SET);
        I2C_GenerateSTART(I2C1, ENABLE);                   //
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));    //
        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//
        I2C_SendData(I2C1, 0x01);                                    //
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));//
        I2C_SendData(I2C1, 4);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTOP(I2C1, ENABLE);                   //
}

//i2c1读数据,在芯片的0x01读出数据
u8 I2C1H_Read_data()
{
        u8 buf;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)==SET);
        I2C_GenerateSTART(I2C1, ENABLE);
        while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//
        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1, 0x01);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        I2C_AcknowledgeConfig(I2C1,DISABLE);//¹Ø±ÕÏìÓ¦
        while(! I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));//EV7
        buf = I2C_ReceiveData(I2C1);
       
        I2C_GenerateSTOP(I2C1,ENABLE);
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        return buf;
}

使用特权

评论回复

相关帖子

沙发
qq583678156|  楼主 | 2020-4-3 20:28 | 只看该作者
怎么没人帮忙回答啊????

使用特权

评论回复
板凳
airwill| | 2020-4-3 21:04 | 只看该作者
看看, 时序问题,  可以用示波器检查

使用特权

评论回复
评论
airwill 2020-4-8 23:13 回复TA
@qq583678156 : I2C_GenerateSTOP(I2C1,ENABLE); I2C_AcknowledgeConfig(I2C1,ENABLE); 读的后面是不是该发 NACK, 再 STOP ? 
qq583678156 2020-4-8 22:02 回复TA
在单步调试中,写数据是正常的,第一次read数据后,后面不论是读还是写就卡在了第三条语句while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 
qq583678156 2020-4-8 22:00 回复TA
买的开发板,自己家里调,没示波器看 
地板
Prry| | 2020-4-7 17:52 | 只看该作者
建议用模拟i2c:
https://blog.csdn.net/qq_20553613/article/details/78878211

使用特权

评论回复
评论
qq583678156 2020-4-8 21:59 回复TA
模拟的能用,用STM32CubeMX自己配置的也能用,但是用普通的这种库配置就有问题,不知道问题是怎么个出现的 
5
axbin| | 2020-4-12 17:05 | 只看该作者
主模式接收单个字节时,要先设置NACK、设置STOP再接收

使用特权

评论回复
6
ayb_ice| | 2020-4-13 11:08 | 只看该作者
我从不用硬件IIC

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝