1959|1

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP430的硬件I2C讲解之三 [复制链接]

写单个字节
向I2C从设备写入单个字节应该是最为简单的一个操作,因为所有的控制权都在主机手中。写单个字节实际包括了2个重要部分,一个便是写寄存器地址,另一个便是写寄存器内容。对于AT24C02而言,存储内容的字节长度为一个字节,而对于容量更大的EEPROM而言,存储地址可为两个字节。


2.1 代码实现
[cpp] view plain copy
在CODE上查看代码片派生到我的代码片
uint8_teeprom_writebyte( uint8_t word_addr, uint8_tword_value )  
{  
  while( UCB0CTL1& UCTXSTP );  
  UCB0CTL1 |= UCTR;                // 写模式  
  UCB0CTL1 |= UCTXSTT;             // 发送启动位  
   
  UCB0TXBUF = word_addr;           // 发送字节地址  
  // 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可  
  while(!(UCB0IFG& UCTXIFG))  
  {  
    if( UCB0IFG& UCNACKIFG )      // 若无应答 UCNACKIFG=1  
    {  
      return 1;  
    }  
  }   
   
  UCB0TXBUF = word_value;          // 发送字节内容  
  while(!(UCB0IFG& UCTXIFG));     // 等待UCTXIFG=1  
   
  UCB0CTL1 |= UCTXSTP;  
  while(UCB0CTL1& UCTXSTP);       // 等待发送完成  
   
  return 0;  
}  


2.2 代码分析
关于代码出口的说明,关于I2C的读写函数,若返回值为0说明所有的操作正常,若返回值为非0说明操作有误,例如1代表从机无应答。这种组合方式可能与各位的编程习惯有出入,一般认为返回1表示操作成功,而返回0表示操作失败。这种方式的问题便是无法有效的表达错误原因,因为“0”只有一个,而非“0”却有很多。
写单个字节可以划分为——从机写地址发送、寄存器地址发送、寄存器内容发送。寄存器地址的发送由MSP430自动完成,这和软件模拟的操作有所区别。请勿发送I2C从机地址,若操作AT24C02发送需要写入的存储字节的首地址即可。
在单字节和多字节写操作过程中,尤其要注意UCTXSTT标志位的变化位置。UCTXSTT标志位会在从机接收完写控制字节或读控制字节之后变化,但是在写控制字节发送之后,必须先填充TXBUF,再尝试等待STT标志位复位,此时STT标志位和TXIFG标志位会同时变化。若从机没有应答,那么NACK标志位也会发生变化。再次强调需要先填充TXBUF,在等待STT标志位复位。以下代码将导致程序一直停留在while(UCB0IFG & UCTXSTT)处,具体的原因可查看MSP430参考手册。
[cpp] view plain copy
在CODE上查看代码片派生到我的代码片
while( UCB0CTL1& UCTXSTP );  
UCB0CTL1 |= UCTR;                // 写模式  
UCB0CTL1 |= UCTXSTT;             // 发送启动位  
// 等待UCTXSTT=0同时变化,但是很遗憾该变化不会发送  
while(UCB0IFG& UCTXSTT);  
UCB0TXBUF = word_addr;           // 发送字节地址  

最新回复

能请教一下用169的I2C 通信的问题吗,功能是主169先发送再读取从169。现在单独的发送和读取都可以了,但是把两个功能放在一起,主169就只执行发送的指令,没有进行读的动作。。  详情 回复 发表于 2018-4-17 22:26
 
点赞 关注

回复
举报

41

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
能请教一下用169的I2C 通信的问题吗,功能是主169先发送再读取从169。现在单独的发送和读取都可以了,但是把两个功能放在一起,主169就只执行发送的指令,没有进行读的动作。。
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表