问题:当IIC发送起始信号后始终无法接收到ADS1115的ACK.。ADS1115的地址是0x48。附上只与发送数据相关的代码代码
void I2C_Init()
{
//——–开启引脚复用功能,BIT6->SCL BIT7->SDA——-//
P1SEL |= BIT6+BIT7;
P1SEL2 |= BIT6+BIT7;
//——–软件复位状态———–//
UCB0CTL1 |= UCSWRST;
//——–同步通信I2C主机状态——-//
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
//——-使用SMCLK,软件复位——–//
UCB0CTL1 = UCSSEL_2 + UCSWRST;
//——-分频系数——-//
UCB0BR0 = 11;
//——-一级别分频一般不启用——–//
UCB0BR1 = 0;
//——从机地址,可在宏定义中修改——-//
UCB0I2CSA = Slave_Addr;
//——开启I2C——-//
UCB0CTL1 &=~ UCSWRST;
_enable_interrupts();
}
void I2C_Tx_Init()
{
UCB0CTL1 |= UCTR;
IFG2 &=~ UCB0TXIFG;
IE2 &=~ UCB0RXIE;
IE2 |= UCB0TXIE;
}
void I2C_TxFrame(unsigned char num,unsigned char *p_Tx)
{
while(UCB0STAT & UCBBUSY);
TxByteCnt = num;
pTxData = (unsigned char *)p_Tx;
I2C_Tx_Init();
UCB0CTL1 |= UCTXSTT;
__bis_SR_register(CPUOFF + GIE);
while (UCB0CTL1 & UCTXSTP);
}
**********************************************/
void I2C_TxFrame_ISR()
{
//—————判断数据剩余个数——-//
if(TxByteCnt)
{
//——–数据填充——-//
UCB0TXBUF = *pTxData;
//——–指针位移——-//
pTxData++;
//——–数据个数减一——-//
TxByteCnt–;
}
else
{
//——–数据个数为0,发送停止位——//
UCB0CTL1 |= UCTXSTP;
//——-没有把数据写入buffer,不能清除中断,需要手动清除中断———-//
IFG2 &=~ UCB0TXIFG;
}
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR_HOOK(void)
{
//——-UCA0和UCB0共用一个中断向量,进入中断前判断哪个触发了中断
if(IFG2 & UCA0TXIFG)
{
IFG2 &=~ UCA0TXIFG;
//———调用事件处理函数——-
}
if(IFG2 & UCB0TXIFG)
{
//———调用事件处理函数——-
I2C_TxFrame_ISR();
}
}
灰小子:
最好观察以下时序。
程序可以参考http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/11287.aspx
Ling Zhu2:
lingming zhang
问题:�IIC发送起始信号后始终无法接收到ADS1115的ACK.。ADS1115的地址是0x48。附上只与发送数据相关的代码代码
void I2C_Init(){ //——–开启引脚复用功能,BIT6->SCL BIT7->SDA——-// P1SEL |= BIT6+BIT7; P1SEL2 |= BIT6+BIT7; //——–软件复位状态———–// UCB0CTL1 |= UCSWRST; //——–同步通信I2C主机状态——-// UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; //——-使用SMCLK,软件复位——–// UCB0CTL1 = UCSSEL_2 + UCSWRST; //——-分频系数——-// UCB0BR0 = 11; //——-一级别分频一般不启用——–// UCB0BR1 = 0; //——从机地址,可在宏定义中修改——-// UCB0I2CSA = Slave_Addr; //——开启I2C——-// UCB0CTL1 &=~ UCSWRST; _enable_interrupts();}
void I2C_Tx_Init(){ UCB0CTL1 |= UCTR; IFG2 &=~ UCB0TXIFG; IE2 &=~ UCB0RXIE; IE2 |= UCB0TXIE;}
void I2C_TxFrame(unsigned char num,unsigned char *p_Tx){ while(UCB0STAT & UCBBUSY); TxByteCnt = num; pTxData = (unsigned char *)p_Tx; I2C_Tx_Init(); UCB0CTL1 |= UCTXSTT; __bis_SR_register(CPUOFF + GIE); while (UCB0CTL1 & UCTXSTP);}
**********************************************/void I2C_TxFrame_ISR(){ //—————判断数据剩余个数——-// if(TxByteCnt) { //——–数据填充——-// UCB0TXBUF = *pTxData; //——–指针位移——-// pTxData++; //——–数据个数减一——-// TxByteCnt–; } else { //——–数据个数为0,发送停止位——// UCB0CTL1 |= UCTXSTP; //——-没有把数据写入buffer,不能清除中断,需要手动清除中断———-// IFG2 &=~ UCB0TXIFG; }}
#pragma vector=USCIAB0TX_VECTOR__interrupt void USCI0TX_ISR_HOOK(void){ //——-UCA0和UCB0共用一个中断向量,进入中断前判断哪个触发了中断 if(IFG2 & UCA0TXIFG) { IFG2 &=~ UCA0TXIFG; //———调用事件处理函数——- } if(IFG2 & UCB0TXIFG) { //———调用事件处理函数——- I2C_TxFrame_ISR(); }}
TI中文支持网



