430自带的IIC模块

[复制链接]
3525|10
 楼主| acer4736 发表于 2013-3-26 15:33 | 显示全部楼层 |阅读模式
学430单片机自带的IIC模块使用,现在编了段小程序,可是运行不正确,程序如下,问题在最后面。
  //初始化IIC模块
  UCB0CTL1 |= UCSWRST;
  UCB0CTL0 |=UCMST+UCMODE1+UCMODE0+UCSYNC; // I2C Master, synchronous mode
  UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  P3SEL |=0x06;     //p3.1为UCB0SDA,P3.2为UCB0SCL
  UCB0CTL1 = UCSSEL_3+UCSWRST;              // Use SMCLK, keep SW reset
  UCB0BR0 =10;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0CTL1 &= ~UCSWRST;   // Clear software reset, resume operation
  //写函数  
  UCB0CTL0 |=UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
  //UCB0CTL1 = UCMODE1+UCMODE0+UCSWRST;       // Use SMCLK, keep software reset
  UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
  UCB0CTL0 &=~UCSLA10;  //从机地址为7位
  UCB0CTL1 |= UCTR;//transmitter mode 发送模式  
  UCB0CTL1 |= UCTXSTT; //start condition,
  while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.
  for(i=0;i<1;i++)
  {
    UCB0TXBUF = 0x0d;//IIC设备中寄存器的地址
    while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零//以上顺序不能改变
    while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,
  }
  UCB0CTL1 |= UCTXSTP;//发送STOP信号
 楼主| acer4736 发表于 2013-3-26 15:33 | 显示全部楼层
1. UCB0CTL1 |= UCTXSTT; 也就是发送START后示波器上显示的IIC从设备的地址信息不对;
2. 程序停在了倒数第二句话while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,既然已经把数据0x0d送到发送缓冲中去,就应该有输出,而且UCB0TXBUF为空才对啊?
jinpaidianzi 发表于 2013-3-26 15:40 | 显示全部楼层
根据手册的描述:
The address is right-justified. In 7-bit slave addressing mode, bit 6 is the MSB, and bits 9-7 are ignored.
cjhk 发表于 2013-3-26 18:48 | 显示全部楼层
使用普通的IO口   可以模拟IIC端口   这个是单片机的特点  不过代码量会很大   呵呵
Linda_008 发表于 2013-4-29 16:28 | 显示全部楼层
正在研究中,同问
Linda_008 发表于 2013-4-29 17:02 | 显示全部楼层
看MSP430F249作为主机发送模式时,时序理解为
发送启始信号--->发送从机地址/写(主机自动完成)--->SDA为低--->等待从机24C02应答--->应答发送数据.......--->应答发送数据--->应答--->发送停止信号
SDA为低是主机自动完成还要软件设置?或是发送完主机地址后UCMST为0转为接收状态,释放SDA空闲,SDA即为0
24C02写时序为:
启始信号--->24C02地址0xa0(写)--->要写入24C02内存储的地址--->写入数据--->发送停止信号
/************************
I2C初始化
*************************/
void I2C_init()
{
    P3SEL = 0x06;                         //P3.1-SDA
   
    BCSCTL1 = CALBC1_1MHZ;                //设DCO频率
    DCOCTL = CALDCO_1MHZ;
   
    UCB0CTL0 |= UCMODE_3 + UCSYNC;        // 从机地址7位 + I2C模式 + 同步,从机24C02地址为7位
    UCB0CTL1 |= UCSSEL_3 ;                       // SCL_CLK = SMCLK为1M
    UCB0BR0 = 10;                                      //CLK = 1000K/10 = 100K;SCL_H >= 5us,SCL_L >= 5us
    UCB0BR1 = 0;
    //UCB0I2CSA = 0xa0;                             // 从机24C02地址0xa0
   
    UCB0CTL1 |= UCSWRST;                        //充许软件复位
}


Linda_008 发表于 2013-4-29 17:22 | 显示全部楼层
参照ATmega16的TWI-I2C与PIC16f877A的I2C
感觉MSP430的时序相差很大
readygo2012 发表于 2013-4-30 14:33 | 显示全部楼层
对于MSP430中的IIC模块编程,以前弄得少,来学习一下
Linda_008 发表于 2013-5-2 21:22 | 显示全部楼层
等待高手回答!!
等待三天 发表于 2013-5-22 19:43 | 显示全部楼层
thcsgpxgy 发表于 2013-6-6 16:42 | 显示全部楼层
UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
SA中保存的地址左移一位再加R/W位才是实际发送的地址,这个要注意。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

1500

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部