你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 NUCLEO板之硬件I2C

[复制链接]
三创电子(Tcreate) 发布时间:2014-12-25 09:56
       今天测试液晶屏附带的AT24C02,都说STM32的I2C是个鸡肋,但是之前用103的I2C、030的I2C 都能驱动,不过大数据操作不知道效果,没有试过,但是STM8的I2C到目前为止,真心没有跑过去,今天再测下072的I2C吧。
       直接跑之前030操作256K的EPROM,发现数据异常,查看手册发现02的内存地址只需要1个字节,改了之后,发现还是有异常,前几个字节是正常的(联系写50字节),后面的全都是0xFF,但是单个字节的写50次都没有问题,然后又对照数据手册看,发现02的连续写最大只支持8字节(256K的支持128字节,也就是page的size定义不同),8字节的连续写感觉和单字节的写 没有啥区别就没在继续测试了,这里贴出读写的核心代码,供大家参考下

初始化:
void I2C_uConfiguration(void)
{
        I2C_InitTypeDef    I2C_uInitStructure;
        GPIO_InitTypeDef   GPIO_uInitStructure;
       
        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
       
        // I2C1_SCL -> PB8
        // I2C1_SDA -> PB90
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1);
       
        GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;  
        GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_Level_3;  // 10M
        GPIO_Init(GPIOB,&GPIO_uInitStructure);
       
        I2C_uInitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_uInitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_uInitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
        I2C_uInitStructure.I2C_DigitalFilter = 0;
        I2C_uInitStructure.I2C_Timing = 0x40B22536;
        I2C_uInitStructure.I2C_OwnAddress1 = 0;
        I2C_uInitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_Init(I2C1,&I2C_uInitStructure);
       
        I2C_Cmd(I2C1,ENABLE);
}


连续读:
void I2C_uReadData(INT8U SlaveAddr,INT8U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
{
        INT8U i;

        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
        I2C_SendData(I2C1,ReadAddr);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);
        I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
        for(i=0;i<ReadLen;i++)
        {
                while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) == RESET);
                ReadBuf[i] = I2C_ReceiveData(I2C1);
        }
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
}


字节写:
void I2C_uWriteByte(INT8U SlaveAddr,INT8U WriteAddr,INT8U Data)
{
        INT8U i;

        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_Reload_Mode,I2C_Generate_Start_Write);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
        I2C_SendData(I2C1,WriteAddr);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
        I2C_TransferHandling(I2C1,SlaveAddr,1,I2C_AutoEnd_Mode,I2C_No_StartStop);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
        I2C_SendData(I2C1, Data);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);
        I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
        Delay_ms(5);
}





收藏 评论16 发布时间:2014-12-25 09:56

举报

16个回答
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:04
STM32的硬件I2C不太稳定

稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
三创电子(Tcreate) 回答时间:2015-1-6 13:28:42
Veiko 发表于 2015-1-6 13:25
一直用的IO模拟的IIC呢,唉

STM8的 我也是一直用的模拟 一直搞不通 呵呵
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
wyxy163@126.com 回答时间:2015-1-4 09:02:44
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-1-4 09:02:59
提示: 作者被禁止或删除 内容自动屏蔽
三创电子(Tcreate) 回答时间:2015-1-5 14:47:48
数码小叶 发表于 2015-1-4 09:02
谢谢分享,学习学习

共同学习!
咱﹑旳青春 回答时间:2015-1-5 14:56:40
不错, 收藏当做参考了
万里-363223 回答时间:2015-1-5 15:04:20
STM32的硬件I2C不太稳定
Veiko 回答时间:2015-1-6 13:25:15
一直用的IO模拟的IIC呢,唉
小贾-370388 回答时间:2015-1-6 13:34:39
好帖子收藏了
三创电子(Tcreate) 回答时间:2015-1-6 14:22:57

正在更新中 嘿嘿
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版