打印

430自带的IIC模块

[复制链接]
2951|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端口   这个是单片机的特点  不过代码量会很大   呵呵

使用特权

评论回复
5
Linda_008| | 2013-4-29 16:28 | 只看该作者
正在研究中,同问

使用特权

评论回复
6
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;                        //充许软件复位
}


使用特权

评论回复
7
Linda_008| | 2013-4-29 17:22 | 只看该作者
参照ATmega16的TWI-I2C与PIC16f877A的I2C
感觉MSP430的时序相差很大

使用特权

评论回复
8
readygo2012| | 2013-4-30 14:33 | 只看该作者
对于MSP430中的IIC模块编程,以前弄得少,来学习一下

使用特权

评论回复
9
Linda_008| | 2013-5-2 21:22 | 只看该作者
等待高手回答!!

使用特权

评论回复
10
等待三天| | 2013-5-22 19:43 | 只看该作者

使用特权

评论回复
11
thcsgpxgy| | 2013-6-6 16:42 | 只看该作者
UCB0I2CSA = 0x3a; //这个地址是真实地址后面加读/写位组成
SA中保存的地址左移一位再加R/W位才是实际发送的地址,这个要注意。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

1500

帖子

3

粉丝