打印

cc2541 sensor 时序 i2c

[复制链接]
1592|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
azq13158|  楼主 | 2015-10-12 15:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式



/**************************************************************************************************
* @fn          HalSensorReadReg
*
* @brief       This function implements the I2C protocol to read from a sensor. The sensor must
*              be selected before this routine is called.
*
* @param       addr - which register to read
* @param       pBuf - pointer to buffer to place data
* @param       nBytes - numbver of bytes to read
*
* @return      TRUE if the required number of bytes are reveived
**************************************************************************************************/
bool HalSensorReadReg(uint8 addr, uint8 *pBuf, uint8 nBytes)
{
  uint8 i = 0;

  /* Send address we're reading from */
  if (HalI2CWrite(1,&addr) == 1)
  {
    /* Now read data */
    i = HalI2CRead(nBytes,pBuf);
  }

  return i == nBytes;
}


第一张图是eeprom的读操作,然后上面的代码是TI 协议栈里的sensor的.  然后我看了下代码,里面的i2c时序和eeprom里datesheet的时序不一样。

TI显示的i2c时序是:
   START -> device_write->write_byte_address->STOP
    START  -> device_read ->data_out -> NACK -> STOP
eeprom 的datesheet显示的i2c时序是:
   START -> device_write->write_byte_address->write_byte_address->
    START  -> device_read ->data_out -> NACK -> STOP
2者的区别就是在read操作时,先要写一个byte地址(从哪开始读),TI是写完byte地址后STOP然后重新START
而eeprom  datesheet里显示的是写完byte地址后,没有STOP,直接重新START.


so i think it should be START  ....  START ..... STOP
but it's                START........STOP.......START.......STOP.
所以希望有能人异士给我解答下,应该如果下手。

GU0VWX]ZUT}28@%}DRHLFRR.png (62.74 KB )

GU0VWX]ZUT}28@%}DRHLFRR.png

相关帖子

沙发
azq13158|  楼主 | 2015-10-12 15:49 | 只看该作者
自己先顶个,静候佳音!

使用特权

评论回复
板凳
dirtwillfly| | 2015-10-13 08:16 | 只看该作者
HalSensorReadReg用于256K以下的EErom完全没有问题的,超过256K的会有麻烦

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
azq13158 + 3
地板
azq13158|  楼主 | 2015-10-13 13:27 | 只看该作者
dirtwillfly 发表于 2015-10-13 08:16
HalSensorReadReg用于256K以下的EErom完全没有问题的,超过256K的会有麻烦

我的是512K bit (62 Kbytes)

使用特权

评论回复
5
azq13158|  楼主 | 2015-10-13 13:38 | 只看该作者
dirtwillfly 发表于 2015-10-13 08:16
HalSensorReadReg用于256K以下的EErom完全没有问题的,超过256K的会有麻烦

当然了,我知道例子给的byte address是8bit的,而我的是需要16bit的,这好解决关键是,TI和eeprom datesheet 俩者描述的时序不一样

使用特权

评论回复
6
dirtwillfly| | 2015-10-13 14:31 | 只看该作者
azq13158 发表于 2015-10-13 13:27
我的是512K bit (62 Kbytes)

修改HalSensorReadReg函数吧,或者自己重新写一个iic的函数。
也可以不用这些函数,直接操作寄存器来操作

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
azq13158 + 2
7
xyz549040622| | 2015-10-14 17:14 | 只看该作者
我的认识是应该两种都可以的。你可以实际试试,如果前者可以的话,直接移植前者的。TI是写完byte地址后STOP然后重新START,我认为这个STOP是无关紧要的。不过最好还是实际试试。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
azq13158 + 3 很给力!
8
azq13158|  楼主 | 2015-10-15 16:32 | 只看该作者
xyz549040622 发表于 2015-10-14 17:14
我的认识是应该两种都可以的。你可以实际试试,如果前者可以的话,直接移植前者的。TI是写完byte地址后STOP ...

明白了,谢了

使用特权

评论回复
9
azq13158|  楼主 | 2015-10-15 16:43 | 只看该作者
xyz549040622 发表于 2015-10-14 17:14
我的认识是应该两种都可以的。你可以实际试试,如果前者可以的话,直接移植前者的。TI是写完byte地址后STOP ...

非常感谢你之前的回复,我还想问个问题:
对于图片中出现的2个器件地址 ,不是很明白两者间的区别,而且datasheet中,并没有关于2者的详细描述。
不知道你对这方面是否熟悉,望赐教!

WSE~RS6VS}5{)XZH)`D9A]N.png (109.37 KB )

WSE~RS6VS}5{)XZH)`D9A]N.png

使用特权

评论回复
10
裁定心生| | 2015-10-31 14:40 | 只看该作者
azq13158 发表于 2015-10-15 16:43
非常感谢你之前的回复,我还想问个问题:
对于图片中出现的2个器件地址 ,不是很明白两者间的区别,而且d ...

两者的指令好像是不同的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
azq13158 + 1
11
dirtwillfly| | 2015-11-6 20:08 | 只看该作者
楼主,问题解决了就结贴吧。
结贴方法:https://bbs.21ic.com/icview-442857-1-1.html

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
azq13158 + 2
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

92

帖子

2

粉丝