主机初始化:
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)的地方了。
谢谢。