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

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个回答
大秦正声 回答时间:2014-12-29 13:15:27
谢谢分享!
沐紫 回答时间:2014-12-29 13:32:35
支持
数码小叶 回答时间:2015-1-4 09:02:44
谢谢分享,学习学习
数码小叶 回答时间: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不太稳定
三创电子(Tcreate) 回答时间:2015-1-5 15:17:18
万里-363223 发表于 2015-1-5 15:04
STM32的硬件I2C不太稳定

稳定性是没有测试过,不过有产品偶尔死机,现在想是不是I2C导致的看门狗复位呢  还没有来得及验证……
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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