OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2842|回复: 6

STM32硬件I2C问题

[复制链接]

338

主题

385

帖子

0

精华

QQ游客

积分
1255
金钱
1255
注册时间
2016-12-9
在线时间
56 小时
发表于 2017-2-10 14:53:31 | 显示全部楼层 |阅读模式
5金钱
卡在while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
两次写Byte间隔时间要超过1ms,要不然写一个Byte后面第二个的时候就卡在上面了,在两次之间加几毫秒的延时才能连续写入,这是为什么呢。这是17位地址的EEROM。
[mw_shl_code=c,true]        for(i=0;i<50;i++)
        {
                IIC_Byte_Write(ch++,0x00,i);
                delay_ms(10);
        }[/mw_shl_code]
[mw_shl_code=c,true]void IIC_Byte_Write( u8 pBuffer, u8 Word_MSBAddress,u8 Word_LSBAddress)
{
         //IIC_Wait_EEprom();                 /*μè′y×ü&#207;&#223;&#191;&#213;&#207;D£&#172;μè′yéè±&#184;&#198;÷&#188;t&#191;&#213;&#207;D£¨&#198;&#228;&#214;DDèòaèí&#188;t&#199;&#229;3ySR1μ&#196;AF&#206;&#187;£&#172;&#188;′ó|′e3é1|£&#169;*/
       
         I2C_GenerateSTART(I2C1, ENABLE);   /*·¢&#203;íò&#187;&#184;&#246;s£&#172;ò2&#190;íê&#199;&#198;eê&#188;D&#197;o&#197;£&#172;òò&#206;a&#199;°&#195;&#230;μ&#196;oˉêy&#195;&#187;óD&#214;&#213;&#214;1£&#172;&#213;a′&#206;&#191;aê&#188;ò2ê&#199;Dèòa&#214;&#216;D&#194;μ&#196;ò&#187;&#184;&#246;&#191;aê&#188;D&#197;o&#197;*/
         //EV5ê&#194;&#188;t
         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); /*&#197;D&#182;&#207;EV5,&#191;′&#207;&#194;oˉêy&#182;¨ò&#229;&#191;éò&#212;·¢&#207;&#214;£&#172;&#184;&#195;ê&#194;&#188;tê&#199;SB=1£&#172;MSL=1£&#172;BUSY=1
                                                                    òa&#203;&#188;ê&#199;&#198;eê&#188;ì&#245;&#188;tò&#209;&#190;-·¢&#203;íá&#203;£&#172;è&#187;oóê&#199;&#214;÷&#196;£ê&#189;£&#172;×ü&#207;&#223;&#212;úí¨&#209;&#182;*/
         
         I2C_Send7bitAddress(I2C1, DEVICE_ADDRESS, I2C_Direction_Transmitter);  /*·¢&#203;í&#198;÷&#188;tμ&#216;&#214;·£&#172;×&#238;oóò&#187;&#184;&#246;2&#206;êy±íê&#190;μ&#216;&#214;·bit0&#206;a0£&#172;òa&#203;&#188;
                                                                                ê&#199;D′2ù×÷£&#172;í&#172;ê±óéóúD′á&#203;DR&#188;&#196;′&#230;&#198;÷£&#172;1ê&#187;á&#199;&#229;3ySB&#206;&#187;±&#228;3é0*/
       
         //EV6 EV8_1£¨&#184;&#195;ê&#194;&#188;t&#197;D&#182;&#207;í&#172;ê±&#197;D&#182;&#207;á&#203;EV8_1ê&#194;&#188;t£&#169;
         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*&#197;D&#182;&#207;EV6oíEV8_1μ&#196;ì&#245;&#188;t£&#172;′&#203;ê±SB=0£&#172;ADDR=1μ&#216;&#214;··¢&#203;í&#189;áê&#248;£&#172;
                                                                             TXE=1êy&#190;Y&#188;&#196;′&#230;&#198;÷DR&#206;a&#191;&#213;£&#172;BUSY=1×ü2&#187;&#191;&#213;&#207;D,MSL=1&#214;÷&#196;£ê&#189;,TRA=1
                                                                                êy&#190;Yò&#209;&#190;-·¢&#203;íá&#203;£¨òò&#206;aê&#199;D′2ù×÷£&#172;&#198;&#228;êμê&#199;μ&#216;&#214;·êy&#190;Yò&#209;&#190;-·¢&#203;íá&#203;£&#169;
                                                                                è&#231;1&#251;ê&#199;&#214;÷ê&#213;&#196;£ê&#189;£&#172;&#213;aà&#239;μ&#196;EV6£&#172;TRA=1±íê&#190;êy&#190;Y&#187;1&#195;&#187;ê&#213;μ&#189;£&#172;0±íê&#190;
                                                                                ê&#213;μ&#189;êy&#190;Y£&#172;×¢òa&#213;aà&#239;TRA=1±íê&#190;ò&#209;&#190;-·¢&#203;íá&#203;£&#172;ADDR=12&#197;ê&#199;·¢&#203;ííê3é
                                                                                á&#203;,×&#246;íê&#184;&#195;ê&#194;&#188;t£&#172;ADDR=0á&#203;ó&#214;*/                                                                           
         
         I2C_SendData(I2C1,Word_MSBAddress);      /*EV8_1ê&#194;&#188;t£&#172;òò&#206;a&#213;aò&#187;2&#189;ê±oòDRò&#209;&#190;-&#206;a&#191;&#213;£&#172;&#184;&#195;ê&#194;&#188;tê&#199;D′è&#235;data1£&#172;&#182;&#212;óúEEPROMà′&#203;μ&#213;a&#184;&#246;data1ê&#199;òaD′è&#235;
                                              ×&#214;&#189;úμ&#196;μ&#196;μ&#216;&#214;·£&#172;data2ê&#199;òaD′è&#235;μ&#196;&#196;úèY£&#172;data1&#206;a8&#206;&#187;1kμ&#196;óDD§×&#214;&#189;úê&#199;μí7&#206;&#187;£&#172;2kbitμ&#196;óDD§×&#214;&#189;úê&#199;8&#206;&#187;£&#172;32ò3£&#172;
                                              &#195;&#191;ò38&#184;&#246;×&#214;&#189;ú£&#172;ò&#187;122k&#206;&#187;£&#172;16kbitDèòa11&#206;&#187;£&#191;&#212;&#245;&#195;′&#203;í£&#191;ó&#195;ó2&#188;tμ&#196;A1£&#172;2£&#172;3&#189;óGPIOà′&#209;&#161;&#212;&#241;′&#230;′¢μ&#196;ò3*/
                                 
         
         //EV8ê&#194;&#188;t
         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); /*&#206;a&#207;&#194;ò&#187;2&#189;&#214;′DDEV8ê&#194;&#188;t£&#172;&#197;D&#182;&#207;TXE=1 DR&#188;&#196;′&#230;&#198;÷&#206;a&#191;&#213;£&#172;×&#188;±&#184;D′è&#235;DR&#188;&#196;′&#230;&#198;÷
                                                                         data2£&#172;×¢òa′&#203;ê±ò2&#197;D&#182;¨TRA=1òa&#203;&#188;ê&#199;data1ò&#209;&#190;-·¢&#203;íá&#203;2&#187;±íê&#190;·¢&#203;ííê3é£&#172;
                                                                         ò&#198;&#206;&#187;&#188;&#196;′&#230;&#198;÷·&#199;&#191;&#213;±íê&#190;êy&#187;1&#212;ú·¢£&#172;áííaBTF=0&#203;μ&#195;÷data1×&#214;&#189;ú·¢&#203;í&#195;&#187;íê3é£&#172;
                                                                                                                                                                                                                                                                         NOSTRETCH&#206;a0ê±oò£&#172;BTF=1&#187;1±íê&#190;D&#194;êy&#190;Yòa±&#187;·¢&#203;íá&#203;£¨òa&#206;&#182;×&#197;×&#214;&#189;ú·¢&#203;í£&#169;
                                                                         íê3éá&#203;μ&#171;ê&#199;D&#194;êy&#190;Y&#187;1&#195;&#187;óDD′è&#235;μ&#189;DRà&#239;&#195;&#230;£&#172;&#213;aà&#239;μ&#196;EV8ê&#194;&#188;t&#182;&#212;óúμ&#196;ò&#187;&#182;&#206;ò&#187;&#214;±
                                                                                                                                                                                                                                                                         ê&#199;óDêy&#190;Y·¢&#203;íμ&#196;£&#172;2&#187;′&#230;&#212;úBTF=1μ&#196;&#199;é&#191;&#246;*/
               
               
               
               
                I2C_SendData(I2C1,Word_LSBAddress);      /*EV8_1ê&#194;&#188;t£&#172;òò&#206;a&#213;aò&#187;2&#189;ê±oòDRò&#209;&#190;-&#206;a&#191;&#213;£&#172;&#184;&#195;ê&#194;&#188;tê&#199;D′è&#235;data1£&#172;&#182;&#212;óúEEPROMà′&#203;μ&#213;a&#184;&#246;data1ê&#199;òaD′è&#235;
                                              ×&#214;&#189;úμ&#196;μ&#196;μ&#216;&#214;·£&#172;data2ê&#199;òaD′è&#235;μ&#196;&#196;úèY£&#172;data1&#206;a8&#206;&#187;1kμ&#196;óDD§×&#214;&#189;úê&#199;μí7&#206;&#187;£&#172;2kbitμ&#196;óDD§×&#214;&#189;úê&#199;8&#206;&#187;£&#172;32ò3£&#172;
                                              &#195;&#191;ò38&#184;&#246;×&#214;&#189;ú£&#172;ò&#187;122k&#206;&#187;£&#172;16kbitDèòa11&#206;&#187;£&#191;&#212;&#245;&#195;′&#203;í£&#191;ó&#195;ó2&#188;tμ&#196;A1£&#172;2£&#172;3&#189;óGPIOà′&#209;&#161;&#212;&#241;′&#230;′¢μ&#196;ò3*/
                                 
         
         //EV8ê&#194;&#188;t
         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING)); /*&#206;a&#207;&#194;ò&#187;2&#189;&#214;′DDEV8ê&#194;&#188;t£&#172;&#197;D&#182;&#207;TXE=1 DR&#188;&#196;′&#230;&#198;÷&#206;a&#191;&#213;£&#172;×&#188;±&#184;D′è&#235;DR&#188;&#196;′&#230;&#198;÷
                                                                         data2£&#172;×¢òa′&#203;ê±ò2&#197;D&#182;¨TRA=1òa&#203;&#188;ê&#199;data1ò&#209;&#190;-·¢&#203;íá&#203;2&#187;±íê&#190;·¢&#203;ííê3é£&#172;
                                                                         ò&#198;&#206;&#187;&#188;&#196;′&#230;&#198;÷·&#199;&#191;&#213;±íê&#190;êy&#187;1&#212;ú·¢£&#172;áííaBTF=0&#203;μ&#195;÷data1×&#214;&#189;ú·¢&#203;í&#195;&#187;íê3é£&#172;
                                                                                                                                                                                                                                                                         NOSTRETCH&#206;a0ê±oò£&#172;BTF=1&#187;1±íê&#190;D&#194;êy&#190;Yòa±&#187;·¢&#203;íá&#203;£¨òa&#206;&#182;×&#197;×&#214;&#189;ú·¢&#203;í£&#169;
                                                                         íê3éá&#203;μ&#171;ê&#199;D&#194;êy&#190;Y&#187;1&#195;&#187;óDD′è&#235;μ&#189;DRà&#239;&#195;&#230;£&#172;&#213;aà&#239;μ&#196;EV8ê&#194;&#188;t&#182;&#212;óúμ&#196;ò&#187;&#182;&#206;ò&#187;&#214;±
                                                                                                                                                                                                                                                                         ê&#199;óDêy&#190;Y·¢&#203;íμ&#196;£&#172;2&#187;′&#230;&#212;úBTF=1μ&#196;&#199;é&#191;&#246;*/
               
               
               
               
               
               
               
               
               
               
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
         I2C_SendData(I2C1,pBuffer);                                    /*êy&#190;Y&#188;&#196;′&#230;&#198;÷DR&#206;a&#191;&#213;£&#172;&#213;aà&#239;ê&#199;D′è&#235;data2£&#172;&#184;&#195;2&#189;&#214;èá¥ê&#244;óúEV8ê&#194;&#188;t*/
       
        /*EV8_2ê&#194;&#188;t£¨&#213;aà&#239;&#190;í·¢&#203;íá&#189;&#184;&#246;data£&#172;&#203;ùò&#212;&#190;í&#214;&#187;óDò&#187;&#184;&#246;EV8ê&#194;&#188;t£&#172;
          EV8_1&#161;adata1£&#172;EV8_1&#161;adata2£&#172;EV8_2oíEV8μ&#196;&#199;&#248;±eê&#199;&#188;ì2aμ&#196;
                2&#238;&#184;&#246;BTF,&#199;òEV8_22&#187;D′DR&#182;&#248;ê&#199;3ìDòòa&#199;óí£&#214;1£&#169;*/
          
         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /*EV8_2μ&#196;ê&#194;&#188;t&#197;D&#182;&#207;oíEV8ê&#194;&#188;t2&#187;ò&#187;&#209;ù£&#172;TRA=1±íê&#190;data2ò&#209;&#190;-·¢&#203;íá&#203;£&#172;
                                                                          BTF=1×&#214;&#189;ú·¢&#203;í&#189;áê&#248;£&#172;&#203;μ&#195;÷&#213;aò&#187;ê±&#191;ì&#195;&#187;óD×&#214;&#189;ú&#212;ú·¢&#203;í£&#172;&#198;&#228;êμ±íê&#190;&#212;ú
                                                                                                                                                                                                                                                                                data2&#213;y&#212;ú·¢&#203;íμ&#196;ê±oò£&#172;&#195;&#187;óDdata3D′è&#235;μ&#189;DRà&#239;&#195;&#230;£&#172; è&#187;oó&#207;&#214;&#212;ú&#184;&#195;&#194;&#214;μ&#189;òa
                                                                          ·¢&#203;ídata3á&#203;£&#172;μ&#171;ê&#199;DRà&#239;&#195;&#230;ê&#199;&#191;&#213;μ&#196;£¨&#198;&#228;êμ·¢&#203;ídata2μ&#196;ê±oò£&#172;&#214;D&#188;&#228;&#196;3ê±
                                                                                                                                                                                                                                                                                &#191;ìDR&#190;íò&#209;&#190;-&#191;&#213;á&#203;£&#169;*/
                                                                                                                                                                                                                                                                                                                                       
         I2C_GenerateSTOP(I2C1,ENABLE);                                  /*EV8_2ê&#194;&#188;t&#214;Dμ&#196;3ìDòD′í£&#214;1*/
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

IIC_Wait_EEprom();里面增加一个start判断总线是否空闲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

338

主题

385

帖子

0

精华

QQ游客

积分
1255
金钱
1255
注册时间
2016-12-9
在线时间
56 小时
 楼主| 发表于 2017-2-10 14:53:32 | 显示全部楼层
IIC_Wait_EEprom();里面增加一个start判断总线是否空闲
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2017-2-10 15:52:15 | 显示全部楼层
你沒搞懂IIC的通訊協議阿
回复

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
发表于 2017-2-10 15:58:16 | 显示全部楼层
硬件iic不好用,还是用模拟的吧
回复

使用道具 举报

338

主题

385

帖子

0

精华

QQ游客

积分
1255
金钱
1255
注册时间
2016-12-9
在线时间
56 小时
 楼主| 发表于 2017-2-10 17:13:19 | 显示全部楼层
Rocks 发表于 2017-2-10 15:52
你沒搞懂IIC的通訊協議阿

M24M01网上很少有呃
回复

使用道具 举报

338

主题

385

帖子

0

精华

QQ游客

积分
1255
金钱
1255
注册时间
2016-12-9
在线时间
56 小时
 楼主| 发表于 2017-2-10 17:13:49 | 显示全部楼层
muk子夜 发表于 2017-2-10 15:58
硬件iic不好用,还是用模拟的吧

这不是浪费资源嘛,模拟慢吗?
回复

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
发表于 2017-2-10 17:50:00 | 显示全部楼层
cxelove 发表于 2017-2-10 17:13
这不是浪费资源嘛,模拟慢吗?

不慢啊,stm32的硬件iic有bug
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-25 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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