请问,C:\Texas Instruments\BLE-CC254x-1.3.2\Components\hal\target\CC2541ST\这个目录下的hal_i2c.h和hal_i2c.c文件是否支持AT24Cxx系列的串行EEPROM ?谢谢!
Leoric miao:
用CSR的也来插一脚。
没有用过CC2541,但是I2C的原理基本都是想通的。
只要CC2541的I2C驱动函数支持16位的reg_add,就能使用AT24Cxx的E2.
如果只支持8位的reg_add,那么你只能使用e2的前256个byte
Kai-Jung Shih:
回复 wenzhong shen:
對於使用二個 Byte 定址的 EEPROM (AT24C), 我找到這個網頁, 寫的很清楚, 大推.
ziye334: CC2541对AT24CXX系列存储器的支持( http://ziye334.lofter.com/post/2435a3_2a2e1b4 )
若是超過二個字節, 則要把位址超過 16 bit 的這幾個 bit 嵌入 Device Address 中. 以 AT24CM01 (1024Kb) 為例, 則要把 memory address bit 16 (由 bit 0 起算) 加入至 device address 的 bit 1.
以下分別為我寫的 Read 與 Write 部份, 可以正確運作. (其中 Read 部份很怪, 要在 dummy write 之後, 再寫入 I2C_STOP 才能開始 read 的 I2C_STRT, 這點跟 spec 中不同, 目前還搞不懂.)
uint8 My_I2C_Mem_Read(uint32 addr, uint8 len, uint8 *pBuf) {uint8 addrL = 0, addrH = 0, addrHH = 0;//KJ-addrL = (uint8)(addr & 0xff); //KJ-addrH = (uint8)(addr >> 8);//KJ-addrHH = (uint8)( (i2cAddr & 0xFC) | ((addr >> 15) & 0x02) );//KJ- i2cAddr | P0//KJ- Dummy Write Start_SignalI2C_STRT();//KJ- Dummy Write Device_Addr.if ( I2CSTAT == mstStarted ) // A start condition has been transmitted{I2C_WRITE( addrHH & 0xFE ); //KJ- set LSB = 0 for Write}if ( I2CSTAT != mstAddrAckW ){len = 0;}//KJ- Dummy Write Memory_AddrI2C_WRITE(addrH);//KJ-I2C_WRITE(addrL);//KJ-//KJ- Dummy Write Stop_SignalI2C_STOP();//KJ- Write Start_Signal for ReadI2C_STRT();if ( I2CSTAT == mstStarted ) // A start condition has been transmitted{I2C_WRITE( addrHH | 0x01 ); //KJ- set LSB = 1 for Read}if ( I2CSTAT != mstAddrAckR ){len = 0;}// All bytes are ACK'd except for the last one which is NACK'd. If only// 1 byte is being read, a single NACK will be sent. Thus, we only want// to enable ACK if more than 1 byte is going to be read.if (len > 1){I2C_SET_ACK();}for (uint8 cnt = 0; cnt < len; cnt++){// slave devices require NACK to be sent after reading last byteif (cnt == len-1){I2C_SET_NACK();}I2C_READ(*pBuf++);// read a byte from the I2C interfaceif (I2CSTAT != mstDataAckR){if (I2CSTAT == mstDataNackR){len = cnt + 1;}else{len = cnt;// something went wrong, so don't count last byte}break;}}I2C_STOP();return len;}
uint8 My_I2C_Mem_Write(uint32 addr, uint8 len, uint8 *pBuf) {uint8 addrL = 0, addrH = 0, addrHH = 0;//KJ-addrL = (uint8)(addr & 0xff); //KJ-addrH = (uint8)(addr >> 8);//KJ-addrHH = (uint8)( (i2cAddr & 0xFC) | ((addr >> 15) & 0x02) );//KJ- i2cAddr | P0//KJ- Write Start_Signal for ReadI2C_STRT();//KJ- Write Device_Addr.if ( I2CSTAT == mstStarted ) /* A start condition has been transmitted */{I2C_WRITE( addrHH & 0xFE ); //KJ- set LSB = 0 for Write}if ( I2CSTAT != mstAddrAckW ){len = 0;}//KJ- Write Memory_AddrI2C_WRITE( addrH );//KJ-I2C_WRITE( addrL );//KJ-//KJ- Write Datafor (uint8 cnt = 0; cnt < len; cnt++){I2C_WRITE(*pBuf++);if (I2CSTAT != mstDataAckW){if (I2CSTAT == mstDataNackW){len = cnt + 1;}else{len = cnt;}break;}}//KJ- Write Stop_SignalI2C_STOP();return len; }
ming li17:
回复 Kai-Jung Shih:
这个我最近也在写,然后我用的是硬件I2C,咱俩可以交流交流。
xiao chen5:
回复 ming li17:
你好!
我用硬件I2C对EEROM读取也遇到一个问题就是,只使用一次HalSensorWriteReg()这个函数是可以的,但是如果我连续使用HalSensorWriteReg()这个函数发现只有第一个语句,内容被写入,后面的没有写入。
比如说
HalSensorReadReg(CURRENT_POSITION_ADDR,eerom_data_1,4 );HalSensorReadReg(START_POSITION_ADDR,eerom_data_2,4 );
只有eerom_data_1这个数组被写入,请大神门在这一块指点一下!
Yong Luo2:
回复 xiao chen5:
不知道你的是哪款芯片,我是有24C02测试的,也是有这样的问题,调试发现当写完延时它又能写进去第二个的;但当写完一个,如果立即读或者写时,启动信号没有应答,导致读或者写都会失败,不知道你的问题现在解决了没有?
xiao chen5:
回复 Yong Luo2:
你好!
你要仔细研读一下,24C02的datasheet。存储芯片也是需要时间的,手册里面会提到时序,和步骤的细节。要循环判断好像是 发送启示信号ACK??现在记不清楚了。
不要直接用2451上面例程上面的。总之要研读24C02哦,加油。用示波器观察I2C的信号,也可以把它记录下来,看一下,翻一下数据。
加油!
ming xia2:
回复 Yong Luo2:
我也想问这个问题,求回答!
————
销售气相色谱仪,液相色谱仪,液相色谱柱,电子天平,PH计等