TI中文支持网
TI专业的中文技术问题搜集分享网站

硬件IIC的从机响应问题

主机初始化:

void IIC_MasterInit(void)

{

 //BCSCTL1 = CALBC1_8MHZ;                             //设置系统内部DCO的时钟

 //DCOCTL = CALDCO_8MHZ;

 /*  选择P1.6 P1.7的第二功能  */

 P1DIR |= BIT6;                              //选择SCLK为输出模式

 P1SEL |= BIT6 + BIT7;                    

 P1SEL2|= BIT6 + BIT7;

 UCB0CTL1 &= ~UCSWRST;

 /*  置为UCSWRST使能  */

 UCB0CTL1 |= UCSWRST;                        // Enable SW reset

 /*  配置IIC的主机模式,选择IIC模式,选择同步通信模式  */

 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C master, synchronous mode

 /*  时钟,从机模式主机模式选择  */

 UCB0CTL1 = UCSSEL_2 + UCSWRST;     //做发送器       // Use SMCLK, Transmitter, keep SW reset

 /*  设置从机地址的位数模式位7位地址莫斯  */

 UCB0CTL0 &=~UCSLA10;                      //设置从机地址的位数模式

 /*  设置时钟分频比  */

 UCB0BR0 = 10;                             // fSCL = SMCLK/12 = ~100kHz

 UCB0BR1 = 0;

 /*  给从机寄存器装地址值  */

 UCB0I2CSA = 0x48;                         //存储器AT24C02的设备地址   // Slave Address

 /*  复位UCSWRST  */

 UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation                      

 //IE2 |=UCB0TXIE+UCB0RXIE;

}

下面是ADS1115的系诶操作:

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

** 函数名:void Write_MutiplyAdd(unsigned char addr,uint data)

** 描述  :向指定地址写入单个字节数据

** 输入  : addr地址寄存器,data待写入的数据

** 输出  :无

** 返回  :无

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

void Write_MutiplyAdd(unsigned char addr,uint data)

{

 UCB0I2CSA =Write_Address;            //写入从机地址UCB0I2CSA        

 while (UCB0CTL1 & UCTXSTP);        //确保停止信号状态的发送

 UCB0CTL1 |=  UCTXSTT+UCTR ;          //启动IIC的主机发送模式

 while(! (IFG2 & UCB0TXIFG) );        //等待发送缓冲寄存器为空,准备发送数据

 UCB0TXBUF = 0X00;

 while(UCB0CTL1 & UCTXSTT) ;          //检测从机ACK信号,有ACK信号,则UCTXSTT自动清零

 while( !(IFG2 & UCB0TXIFG) );        //判断发送标志位

 UCB0TXBUF =  (data<<8);              //写入高地址

 while( !(IFG2 & UCB0TXIFG) );        //判断发送标志位

 UCB0TXBUF =  (data&0x00ff);          //写入低位地址

 while( !(IFG2 & UCB0TXIFG) );

 UCB0CTL1 |= UCTXSTP;                 // 写入成功,则产生停止信号

 IFG2 &= ~UCB0TXIFG;                  // 清除发送中断标志位  

 delay_ms(10);

}

这个写操作里面判断从机是否响应的时候,从机一直没有给出响应信号,这些代码我之前操作TMP100等IIC的器件时都没有问题,怎么到了ADS1115上面就不响应了,ADS1115的地址线接地的地址是0x90,右移一位写入后为0x48,没问题,就是不响应,请问是什么原因呀?

Hardy Hu:

1.USCI-B的硬件会自动将从机地址移位,所以UCB0I2CSA直接给0x90就行了,不要移位后再赋值。

2.你调试的时候程序死在哪一步了?你指的没响应是发送地址后就挂了,还是发送寄存器命令后没响应?

HaiTao Li:

我在TI官方的例子里看到的是UCB0I2CSA = 0x48;

HaiTao Li:

CCS里给的是UCB0I2CSA = 72;

Leon Yan:

你好:

Hardy的回答是正确的,MSP430会自动处理地址移位问题。

再一个,你最好跟踪调试一下,现在MCU肯定死在哪个while(1)的地方了。

谢谢。

赞(0)
未经允许不得转载:TI中文支持网 » 硬件IIC的从机响应问题
分享到: 更多 (0)