打印

同学们,ST关于i2c-e2prom的例子,修改以下几点就可以了

[复制链接]
15195|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lut1lut|  楼主 | 2008-8-28 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.之前有同学说发现I2C_EE_BufferWrite执行后,总线就被拉低了,使得后来的start位发不出去

这是因为每个I2C_EE_BufferWrite都是以I2C_EE_WaitEepromStandbyState结尾的,而这个函数里并未发送stop位来释放总线

所以第一个需要修改的地方就是在I2C_EE_WaitEepromStandbyState结尾加上I2C_GenerateSTOP(I2C1, ENABLE);

2.很多同学还发现在I2C_EE_BufferWrite接下来的I2C_EE_BufferRead中,死在了check EV6。

正因为第一点,有了stop位后,马上来start位,肯定不行;因为从e2prom的datasheet中有专门一个参数限制了Time between Stop condition and next Start condition。这个值typically 1.3us minimum。

所以代码中需要保证这个延迟。

3.附件中提供了修改后的代码,在各个I2C-speed(100K/200K/300K/400K)和各种MCU频率(PLL *6/*7/*8/*9),各种组合都可以运行正确了。
代码是跑在万利的EK-STM32F103板子上的。
相关链接:https://bbs.21ic.com/upfiles/img/200710/2007101316746703.zip
沙发
8bit_mcu| | 2008-8-28 17:33 | 只看该作者

bucuo

顶!

谢谢lut1lut老师!

收藏了



使用特权

评论回复
板凳
hanker510| | 2008-8-29 09:08 | 只看该作者

谢谢

  马上试一下 

使用特权

评论回复
地板
三井寿| | 2008-8-29 11:55 | 只看该作者

谢谢了

谢谢lut1lut,已经能用了

使用特权

评论回复
5
sunke9| | 2008-8-29 11:59 | 只看该作者

我试了一下

我在万利的EK-STM32F板上,I2C_PageSize = 8时速度400 300 100 都可以;
I2C_PageSize = 16 ,上面3个速率都不行数据错误,但是在我的板子上24C04上可以.

使用特权

评论回复
6
香水城| | 2008-8-29 12:12 | 只看该作者

请6楼注意看看I2C的上拉电阻

使用特权

评论回复
7
sunke9| | 2008-8-29 13:19 | 只看该作者

上拉电阻怎么了?

我的EEPROM接法和万利的完全相同.

使用特权

评论回复
8
lut1lut|  楼主 | 2008-8-29 14:20 | 只看该作者

pagesize取决于你的用的e2prom的size啊

比如atmel的
24C01/02都是8 byte per page
24C04/08/16就是16 byte per page。

6楼的所谓数据错误肯定是说写进和读出相比较不一致,不是通信失败。

为什么page size不同会造成比较不一致,请看buffer write这个函数的实现,就知道了~~~

使用特权

评论回复
9
香水城| | 2008-8-29 14:28 | 只看该作者

我是说:请注意上拉电阻的阻值

如果上拉电阻的阻值太大,I2C的高速度会受影响。

使用特权

评论回复
10
sunke9| | 2008-8-29 14:41 | 只看该作者

可是资料上写着只有24C01的页是8个字节啊

概述
CAT24WC01/02/04/08/16 是一个1K/2K/4K/8K/16K 位串行CMOS E2PROM 内部含有
128/256/512/1024/2048 个8 位字节CATALYST 公司的先进CMOS 技术实质上减少了器件的功耗
CAT24WC01 有一个8 字节页写缓冲器CAT24WC02/04/08/16 有一个16 字节页写缓冲器该器件通过
I2C 总线接口进行操作有一个专门的写保护功能

使用特权

评论回复
11
lut1lut|  楼主 | 2008-8-29 14:48 | 只看该作者

data sheet错了,还是你看错了?


万利板子上放的是Atmel的24C02,它的page size=8,你用16当然不行;
你的板子是24c04,它的page size=16,用16当然可以。

以下摘自atmel的data sheet
------------------------------------------------------------------
Memory Organization AT24C01A, 1K SERIAL EEPROM: Internally organized with 16 pages of 8 bytes each,
the 1K requires a 7-bit data word address for random word addressing.
AT24C02, 2K SERIAL EEPROM: Internally organized with 32 pages of 8 bytes each,
the 2K requires an 8-bit data word address for random word addressing.
AT24C04, 4K SERIAL EEPROM: Internally organized with 32 pages of 16 bytes each,
the 4K requires a 9-bit data word address for random word addressing.
AT24C08A, 8K SERIAL EEPROM: Internally organized with 64 pages of 16 bytes each,
the 8K requires a 10-bit data word address for random word addressing.
AT24C16A, 16K SERIAL EEPROM: Internally organized with 128 pages of 16 bytes
each, the 16K requires an 11-bit data word address for random word addressing.
--------------------------------------------------------------------

使用特权

评论回复
12
hanker510| | 2008-8-29 15:40 | 只看该作者

我的测试结果

 to lut1lut 我将万利板子上的改为了AT24C1024
 -------------------------------------------------------------------
 AT24C1024, 1024K SERIAL EEPROM: The 1024K is internally organized as 512 pages of 256 bytes each. Random word addressing requires a 17-bit data word address.
 I2C_PageSize = 16 测试通过,应该改为I2C_PageSize =256。

---------------------------------------------------------------------

使用特权

评论回复
13
sunke9| | 2008-8-29 15:46 | 只看该作者

如果是data sheet错了,就对了

使用特权

评论回复
14
hanker510| | 2008-8-29 15:52 | 只看该作者

To lixun00 测试通过 谢谢

使用特权

评论回复
15
hanker510| | 2008-8-29 16:03 | 只看该作者

To lixun00 测试通过 谢谢


  lixun00老师的方法对原例程修改不大,本人较为支持
  单步运行的时候 I2C_EE_BufferRead() 中发送完读地址之后的/* Test on EV7 and clear it */
  if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  老是过不去,#define  I2C_EVENT_MASTER_BYTE_RECEIVED    ((u32)0x00030040)  /* BUSY, MSL and RXNE flags */
  实际读出的值 SR1=0x44 与预期的SR1=0x40 相差BTF这一位,相关描述:如果RxNE 位被置位,并且在上一次数据接收之后DR 寄存器中的数据没有被读走,硬件将置起BTF 位,接口等待读DR 寄存器。 
 分析在发送读地址之后确实没有进行读操作,所以增加
 #define  I2C_EVENT_MASTER_BYTE_RECEIVED1     ((u32)0x00030044)  /* BUSY, MSL and RXNE BTF flags */
 并替换if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED1))
 单步测试运行通过,请lixun00老师斟酌一下。

  

使用特权

评论回复
16
lixun00| | 2008-8-29 20:15 | 只看该作者

RE hanker510:

老师不敢当,共同探讨

使用特权

评论回复
17
栏杆| | 2008-10-8 11:41 | 只看该作者

嘿嘿,貌似很多网上收来的IIC代码都有这个问题。

估计ST当初也是直接用来那么改写的。这个代码没有考虑到连续读写。

使用特权

评论回复
18
dt0216| | 2008-10-8 17:24 | 只看该作者

数据好像只在一页上读写

to lixun00 :
     程序用到板子上调试连续读时 不管输入地址都是从00开始。
     写时只在第一页上。
#define I2C_OwnAddr  0xA0
#define I2C_PageSize   16 //at24c08

 //u8 s[]=0 ....99; 

 I2C_EE_BufferWrite(I2C_OwnAddr,0,s,30);// 从00地址开始写入0~90  
 I2C_EE_BufferRead(I2C_OwnAddr,0,s,30);//s=16,..25,10..14,ff..ff(第一页写反转)

 s[0]=0x55;
 I2C_EE_BufferWrite(I2C_OwnAddr,5,s,1);//05地址写入0x55
 I2C_EE_BufferRead(I2C_OwnAddr,0,s,30);//s=0x55,17..25,10..14,ff..ff(本应该写入05地址的 写到了00上)
不知道是什么原因?
  

 


                     
         

使用特权

评论回复
19
唐靖丰| | 2009-1-28 17:15 | 只看该作者

这个问题,万利竟然还没改。

我前几天下了最新的程序跑了半天不行,想起了就到这里看看。
终于就解决了。万利的板子上焊了个2402,程序确是2408的,地址还给设置成了0XA2.那就只有2408,2416就才能用呢。
唉,这个也是正经销售的板子啊,怎么也更新下驱动啊?

使用特权

评论回复
20
shubiao166| | 2009-4-16 16:07 | 只看该作者

haodongxi

下来看下

使用特权

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

本版积分规则

8

主题

483

帖子

3

粉丝