社区导航

 

搜索
查看: 593|回复: 0

[资料分享] MSP430的硬件I2C讲解之二

[复制链接]

6412

TA的帖子

19

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2018-3-10 22:46 | 显示全部楼层 |阅读模式
代码实现
[cpp] view plain copy
在CODE上查看代码片派生到我的代码片
void ucb0_config(void)  
{  
  P3SEL &= ~BIT2;                        // P3.2@UCB0SCL  
  P3DIR |= BIT2;  
  P3OUT |= BIT2;  
  // 输出9个时钟以恢复I2C总线状态  
  for( uint8_t i= 0; i <9 ; i++)  
  {  
    P3OUT |= BIT2;  
    __delay_cycles(8000);  
    P3OUT &= ~BIT2;  
    __delay_cycles(8000);  
  }  

  P3SEL |= (BIT1 + BIT2);                // P3.1 UCB0SDAP3.2@UCB0SCL  
  // P3.1@ISP.1 P3.2@ISP.5  

  UCB0CTL1 |= UCSWRST;  
  UCB0CTL0 = UCMST+ UCMODE_3 + UCSYNC;  // I2C主机模式  
  UCB0CTL1 |= UCSSEL_2;                  // 选择SMCLK  
  UCB0BR0 = 40;  
  UCB0BR1 = 0;  
  UCB0CTL0 &= ~UCSLA10;                  // 7位地址模式  
  UCB0I2CSA = EEPROM_ADDRESS;           // EEPROM地址  
  UCB0CTL1 &= ~UCSWRST;  
}  


代码分析
      I2C从设备的地址一般有以下通俗说法——7位地址,写地址(写控制字)和读地址(读控制字)。1个I2C通信的控制字节(I2C启动之后传送的第一个字节)由7位I2C地址和1位读写标志位组成,7位I2C地址即7位地址,若读写标志位为读标志(读写标志位置位)加上7位I2C地址便组成了读地址(读控制字),若读写标志位为写标志(读写标志位清零)加上7位地址便组成了写地址(写控制字)。例如AT24C02的I2C7位地址为0x50,读地址(读控制字)为0xA1,写地址(写控制字)为0xA1。
在MSP430F5系列中,I2CSA地址寄存器应写入7位地址,参照上面的例子应写入0X50。至于I2C读写位的控制由CTL1寄存器完成,用户无需干预。
在I2C设置开始之前,可以先通过SCL端口发送9个时钟信号,该时钟信号可以是I2C从机芯片从一种错误的通信状态恢复,虽然这9个时钟信号不起眼但是对于调试过程来说非常有用。例如在调试过程中,错误的发送了停止位,若再次启动调试则I2C从设备仍处于一种错误的状态,这9个时钟信号可以把I2C从设备从错误的状态“拉”回来。


回复

使用道具 举报

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

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-30 20:30 , Processed in 0.077949 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表