×
嵌入式 > 技术百科 > 详情

msp430硬件II2C

发布时间:2020-06-18 发布时间:
|

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

  1. /*******************************************************************************  

  2. 包含头文件  

  3. *******************************************************************************/  

  4. #include  

  5. /*******************************************************************************  

  6. 全局变量的定义  

  7. *******************************************************************************/  

  8. unsigned char RXData;  

  9. unsigned char count;  

  10. /*******************************************************************************  

  11. 函数定义  

  12. *******************************************************************************/  

  13. void IIC_init(void);                         // 初始化设置  

  14. void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);  

  15.                                              // 字节写设置  

  16. void EEPROM_radom(unsigned char high_Address,unsigned char low_Address);  

  17.                                              // 随机读设置  

  18. void EEPROM_read();                          // 连续读设置  

  19. /*************************************************************************  

  20. ** 函数名称:  

  21. ** 工作环境:    

  22. ** 作者:      

  23. ** 生成日期:  

  24. ** 功能:STOP信号和START信号之间延时 5MS  

  25. ** 相关文件:  

  26. ** 修改日志:  

  27. *************************************************************************/  

  28. void Delay()  

  29. {  

  30.   for(unsigned char i=0;i<0xff;i++);  

  31.   for(unsigned char i=0;i<0xff;i++);  

  32.   for(unsigned char i=0;i<0xff;i++);  

  33.   for(unsigned char i=0;i<0xff;i++);  

  34.   for(unsigned char i=0;i<0xff;i++);  

  35. }  

  36.  

  37. /*************************************************************************  

  38. ** 函数名称:  

  39. ** 工作环境:  

  40. ** 作者:      

  41. ** 生成日期:  

  42. ** 相关文件:  

  43. ** 修改日志:  

  44. *************************************************************************/  

  45. void main(void)  

  46. {  

  47.    

  48.   WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗  

  49.   for(unsigned char i=0;i<0xff;i++);  

  50.   IIC_init();                               // 初始化IIC  

  51.   EEPROM_Write(0x01,0x00,0x10);             // 字节写  

  52.   Delay();                                  // 延时  

  53.   EEPROM_radom(0x01,0x00);                  // 随机读  

  54.   EEPROM_read();                            // 立即读  

  55.   LPM0;  

  56. }  

  57. /*************************************************************************  

  58. ** 函数名称:  

  59. ** 工作环境:  

  60. ** 作者:      

  61. ** 生成日期:  

  62. ** 功能:初始化I2C接口  

  63.         传输方式设置,主从设置,波特率设置  

  64. ** 相关文件:  

  65. ** 修改日志:  

  66. *************************************************************************/  

  67. void IIC_init(void)  

  68. {  

  69.   P10SEL |= BIT1 + BIT2;  

  70.   P10REN |= BIT1 + BIT2;  

  71.   UCB3CTL1 |= UCSWRST;                      // 置位UCSWRST  

  72.   UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C 主机, 同步 模式  

  73.   UCB3CTL1 |= UCSSEL_2;                     // SMCLK  

  74.   UCB3BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz  

  75.   UCB3BR1 = 0;  

  76.   UCB3I2CSA = 0x50;                         // 从机地址0x50  

  77.   UCB3CTL1 &= ~UCSWRST;                     // 清除UCSWRST  

  78.   UCB3IE |= UCRXIE;                         // 使能接收中断  

  79.   _EINT();  

  80. }  

  81.  

  82. /*************************************************************************  

  83. ** 函数名称:  

  84. ** 工作环境:  

  85. ** 作者:      

  86. ** 生成日期:  

  87. ** 功能:向相关的存储单元写入数据  

  88. ** 相关文件:  

  89. ** 修改日志:  

  90. *************************************************************************/  

  91. void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)  

  92. {  

  93.   while (UCB3CTL1 & UCTXSTP);               // 确定总线空闲  

  94.   UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为发送模式  

  95.   UCB3TXBUF = high_Address;                 // 发送高位地址  

  96.   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  97.   UCB3TXBUF = low_Address;                  // 发送低位地址  

  98.   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  99.   UCB3TXBUF = Word;                         // 发送数据  

  100.   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  101.   UCB3CTL1 |= UCTXSTP;                      // 发送停止位  

  102.   while((UCB3CTL1 & UCTXSTP)==1);           // 判断停止位是否发送完毕  

  103. }  

  104.   

  105. /*************************************************************************  

  106. ** 函数名称:字节读函数  

  107. ** 工作环境:  

  108. ** 作者:      

  109. ** 生成日期:  

  110. ** 功能:     连续读发送设置  

  111. ** 相关文件:  

  112. ** 修改日志:  

  113. *************************************************************************/  

  114. void EEPROM_read()  

  115. {  

  116.   UCB3CTL1 &= ~UCTR;                       // 确定为读  

  117.   while (UCB3CTL1 & UCTXSTP);              // 总线是否空闲  

  118.   UCB3CTL1 |= UCTXSTT;                     // 发送开始位  

  119. }  

  120.   

  121. /*************************************************************************  

  122. ** 函数名称:字节写函数  

  123. ** 工作环境:  

  124. ** 作者:      

  125. ** 生成日期:  

  126. ** 功能:     随机读发送设置  

  127. ** 相关文件:  

  128. ** 修改日志:  

  129. *************************************************************************/  

  130. void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)  

  131. {  

  132.   while (UCB3CTL1 & UCTXSTP);               // Ensure stop condition got sent  

  133.   UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为写  

  134.   UCB3TXBUF = high_Address;                 // 发送地址位高位  

  135.   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  136.   UCB3TXBUF = low_Address;                  // 发送地址位低位  

  137.   while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  138.   UCB3CTL1 &= ~UCTR;                        // 确定为接收  

  139.   while (UCB3CTL1 & UCTXSTP);               // 判断总线是否被释放  

  140.   UCB3CTL1 |=UCTXSTT;                       // 重新发送起始位  

  141.   while((UCB3CTL1 & UCTXSTT)==1);           // 判断起始位是否发送成功  

  142.   for(unsigned char i=0x0;i<0x2f;i++);      // 延时确定数据已经被发送出去  

  143.   UCB3CTL1 |=UCTXSTP + UCTXNACK;            // 发送停止位和NACK位  

  144. }  

  145.   

  146. /*************************************************************************  

  147. ** 函数名称:接收中断函数  

  148. ** 工作环境:  

  149. ** 作者:      

  150. ** 生成日期:  

  151. ** 功能:    存取接收的数据  

  152. ** 相关文件:  

  153. ** 修改日志:  

  154. *************************************************************************/  

  155. #pragma vector = USCI_B3_VECTOR  

  156. __interrupt void USCIAB3_ISR(void)  

  157. {  

  158.   if(UCB3IFG  & UCRXIFG)                     // 接收中断  

  159.   {  

  160.    count++;  

  161.    RXData = UCB3RXBUF;  

  162.   }  

  163. }  

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

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器