STM32F407硬件IIC读写AT24C02,已经测试成功

2019-07-20 06:11发布

本帖最后由 八度空间 于 2016-4-8 23:55 编辑

编译环境:MDK5.18
库函数版本:V1.5.1
测试平台:原子探索者开发板

大多数人都说STM32的硬件IIC不稳定,等等,之前用官方的例程在103上面测试,不稳定,听说在F4上面好点,就弄了一下,喜欢白老鼠的朋友可以拿去测试一下

1、配置注意了(寄存器操作的朋友注意了)按照官方参考手册给的配置流程进行配置IIC相关的寄存器(我之前试过不按照官方这个,没成功,后续就用库函数来了)
1.png
2、大家注意看寄存器CR1的第7位,看手册说明
2.png
3.png
官方也有相关经验手册供大家参考,大家请参考这个文档《时钟延展导致 I2C 通信不可靠
所以,在初始化完成之后,我的代码中这位是置位的
3、在进行数据发送与读取过程,注意怎样清除相关的标志位,操作不能少了,否则意想不到的意外就发生了,操作流程在参考手册上也有(我用的是7位设备地址,至于10位的留给大家了)
4.png
5.png
6.png
7.png
4、特别注意发送操作与读取操作中EVx事件清标志位的方法
5、附件也上传几份官网的经验手册
6、奉上测试逻辑分析仪抓取的波形两份
8.png
9.png


这份代码在战舰V3开发板上面进行了一次测试,也读写正常,至于什么DMA发送与接收我就还没弄,过后打算试下用这个硬件做下IIC从模式看下行不行,同时大家也可以帮忙测试一下代码的稳定性和可靠性

在F407和F103上面进行移植,我这份代码做了自动适配的,只需要将相关的库函数和MDK中的define定义一下即可



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
八度空间
1楼-- · 2019-07-23 11:15
 精彩回答 2  元偷偷看……
八度空间
2楼-- · 2019-07-23 14:51
zhaoking100 发表于 2017-4-23 14:05
楼主请看看,上面的读取程序,读取的数据也是对的。 但是结束后。 SCL=1;SDA=0; 导致下一次进不了写数据, ...

你是哪个芯片
八度空间
3楼-- · 2019-07-23 18:28
 精彩回答 2  元偷偷看……
关山难越
4楼-- · 2019-07-24 00:10
楼主你好,我在用你硬件IIC程序的测试程序时候,我用的不是AT芯片,而是其他的I2C芯片,我也是用你的程序测试的,有个问题想请教下,我的寄存器地址和发送(接收)的数据都是16位的,我在你的基础上更改了一下,你看一下这样会不会有什么问题,

u8 Hard_IIC_WriteOneByte(I2C_TypeDef* IICx, uint8_t SlaveAdd, u8 writeAdd, u8 data,u8 * err)
u8 Hard_IIC_WriteOneByte(I2C_TypeDef* IICx, uint8_t SlaveAdd, u16 writeAdd, u16 data ,u8 * err)
u8的更改为u16的了,

I2C_SendData(IICx, WriteAdd);  //发送寄存器地址
        temp = 0;
        //
        //EV8
        //
        while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING))
        {
                temp++;
                if (temp > 800)
                {
                        *err |= 1<<3;
                        I2C_GenerateSTOP(IICx, ENABLE);  //2úéúí£&#214;1D&#197;o&#197;
                        return;
                }
        }




I2C_SendData(IICx, (WriteAdd>>8)&oxFF);  //发送寄存器地址
        temp = 0;
        //
        //EV8
        //
        while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING))
        {
                temp++;
                if (temp > 800)
                {
                        *err |= 1<<3;
                        I2C_GenerateSTOP(IICx, ENABLE);  //2úéúí£&#214;1D&#197;o&#197;
                        return;
                }
        }

I2C_SendData(IICx, (WriteAdd&0xFF);  //发送寄存器地址
        temp = 0;
        //
        //EV8
        //
        while (!I2C_CheckEvent(IICx, I2C_EVENT_MASTER_BYTE_TRANSMITTING))
        {
                temp++;
                if (temp > 800)
                {
                        *err |= 1<<3;
                        I2C_GenerateSTOP(IICx, ENABLE);  //2úéúí£&#214;1D&#197;o&#197;
                        return;
                }
        }

请问我这样完成一个16位的寄存器地址发送有没有问题
关山难越
5楼-- · 2019-07-24 05:21
我能把我的程序发你邮箱,你帮我看一下硬件I2C程序有没有问题么,我发送完I2C地址之后一直就没有应答,程序就死了
八度空间
6楼-- · 2019-07-24 06:48
 精彩回答 2  元偷偷看……

一周热门 更多>