1943|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

msp430系列硬件I2C操作24LC128程序 [复制链接]

说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。

***************************************************************************************/

运行代码 复制代码
  • /*******************************************************************************  
  • 包含头文件  
  • *******************************************************************************/  
  • #include   
  • /*******************************************************************************  
  • 全局变量的定义  
  • *******************************************************************************/  
  • unsigned char RXData;  
  • unsigned char count;  
  • /*******************************************************************************  
  • 函数定义  
  • *******************************************************************************/  
  • void IIC_init(void);                         // 初始化设置  
  • void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);  
  •                                              // 字节写设置  
  • void EEPROM_radom(unsigned char high_Address,unsigned char low_Address);  
  •                                              // 随机读设置  
  • void EEPROM_read();                          // 连续读设置  
  • /*************************************************************************  
  • ** 函数名称:  
  • ** 工作环境:   
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:STOP信号和START信号之间延时 5MS  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void Delay()  
  • {  
  •   for(unsigned char i=0;i<0xff;i++);  
  •   for(unsigned char i=0;i<0xff;i++);  
  •   for(unsigned char i=0;i<0xff;i++);  
  •   for(unsigned char i=0;i<0xff;i++);  
  •   for(unsigned char i=0;i<0xff;i++);  
  • }  
  • /*************************************************************************  
  • ** 函数名称:  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void main(void)  
  • {  
  •    
  •   WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗  
  •   for(unsigned char i=0;i<0xff;i++);  
  •   IIC_init();                               // 初始化IIC  
  •   EEPROM_Write(0x01,0x00,0x10);             // 字节写  
  •   Delay();                                  // 延时  
  •   EEPROM_radom(0x01,0x00);                  // 随机读  
  •   EEPROM_read();                            // 立即读  
  •   LPM0;  
  • }  
  • /*************************************************************************  
  • ** 函数名称:  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:初始化I2C接口  
  •         传输方式设置,主从设置,波特率设置  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void IIC_init(void)  
  • {  
  •   P10SEL |= BIT1 + BIT2;  
  •   P10REN |= BIT1 + BIT2;  
  •   UCB3CTL1 |= UCSWRST;                      // 置位UCSWRST  
  •   UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C 主机, 同步 模式  
  •   UCB3CTL1 |= UCSSEL_2;                     // SMCLK  
  •   UCB3BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz  
  •   UCB3BR1 = 0;  
  •   UCB3I2CSA = 0x50;                         // 从机地址0x50  
  •   UCB3CTL1 &= ~UCSWRST;                     // 清除UCSWRST  
  •   UCB3IE |= UCRXIE;                         // 使能接收中断  
  •   _EINT();  
  • }  
  • /*************************************************************************  
  • ** 函数名称:  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:向相关的存储单元写入数据  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)  
  • {  
  •   while (UCB3CTL1 & UCTXSTP);               // 确定总线空闲  
  •   UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为发送模式  
  •   UCB3TXBUF = high_Address;                 // 发送高位地址  
  •   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  
  •   UCB3TXBUF = low_Address;                  // 发送低位地址  
  •   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  
  •   UCB3TXBUF = Word;                         // 发送数据  
  •   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  
  •   UCB3CTL1 |= UCTXSTP;                      // 发送停止位  
  •   while((UCB3CTL1 & UCTXSTP)==1);           // 判断停止位是否发送完毕  
  • }  
  •   
  • /*************************************************************************  
  • ** 函数名称:字节读函数  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:     连续读发送设置  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void EEPROM_read()  
  • {  
  •   UCB3CTL1 &= ~UCTR;                       // 确定为读  
  •   while (UCB3CTL1 & UCTXSTP);              // 总线是否空闲  
  •   UCB3CTL1 |= UCTXSTT;                     // 发送开始位  
  • }  
  •   
  • /*************************************************************************  
  • ** 函数名称:字节写函数  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:     随机读发送设置  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)  
  • {  
  •   while (UCB3CTL1 & UCTXSTP);               // Ensure stop condition got sent  
  •   UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为写  
  •   UCB3TXBUF = high_Address;                 // 发送地址位高位  
  •   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  
  •   UCB3TXBUF = low_Address;                  // 发送地址位低位  
  •   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  
  •   UCB3CTL1 &= ~UCTR;                        // 确定为接收  
  •   while (UCB3CTL1 & UCTXSTP);               // 判断总线是否被释放  
  •   UCB3CTL1 |=UCTXSTT;                       // 重新发送起始位  
  •   while((UCB3CTL1 & UCTXSTT)==1);           // 判断起始位是否发送成功  
  •   for(unsigned char i=0x0;i<0x2f;i++);      // 延时确定数据已经被发送出去  
  •   UCB3CTL1 |=UCTXSTP + UCTXNACK;            // 发送停止位和NACK位  
  • }  
  •   
  • /*************************************************************************  
  • ** 函数名称:接收中断函数  
  • ** 工作环境:  
  • ** 作者:      
  • ** 生成日期:  
  • ** 功能:    存取接收的数据  
  • ** 相关文件:  
  • ** 修改日志:  
  • *************************************************************************/  
  • #pragma vector = USCI_B3_VECTOR  
  • __interrupt void USCIAB3_ISR(void)  
  • {  
  •   if(UCB3IFG  & UCRXIFG)                     // 接收中断  
  •   {  
  •    count++;  
  •    RXData = UCB3RXBUF;  
  •   }  
  • }  




分享:
程序在开始调试的时候,一直都调不通。数据总是只能发送一次,程序复位后,数据就发不出去了,找了好长时间都找不出来。最后找来示波器,发现数据发送一次后,没有发送停止位,程序停止后,SCL依然为低电平,没有变为高。(复位也不可以)可是将SCL断开后在插上,发现SCL就变成高电平,就可以在发送数据了。当程序发送了停止位后,这种情况就没有了,复位后就可以重新发送数据了。
在对器件进行字节写后,立马进行读操作时,一定要加上足够长的延时,所以在程序中会有5ms的长延时。如果写停止后,立即进行读操作,可能读不到数据。不通的芯片,加的延时可能不通,但延时最好能足够长。
呵呵,一点小小的心得。希望对大家有点用。有错误的地方,希望可以一起交流。
 
点赞 关注(1)

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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