主题中讨论的其他部件:MSP-EXP430G2, MSP430G2553, RF430FRL152H
我正在尝试使用I2C协议在MSP-EXP430G2评估板(具有 MSP430G2533微控制器)和照片探测器(从属)之间进行通信。
我已将2.2 K欧姆从SDA和SCL线路上拉拔的外部电阻器连接到VDD (3.4 电压)。
从属地址为0x2A。
与从属设备通信的协议要求我存储了TX_DATA[8]阵列的以下序列(如下图所示)。
我正在使用的代码粘贴在此处。 问题在于: 我要么没有从从机收到ACK信号(这发生在90 % of the Times,并带有一些随机的上拉值),要么有时当我得到除地址之外的ACK信号时,没有其他数据被传输(这只发生在10 % of the time)。
当我在CCS Studio中单步执行代码时,代码卡在I2C传输中断中: __bis_sr_register(CPUOFF + GIE); 并且不会出现。
是否有人知道为什么会这样? 或者以前有人遇到过类似的问题吗? 我们非常感谢您的任何帮助。
//与I2C从属设备通信,以便从光检测器传输数据
//此处使用TI开发入门套件板
#include <MSP4S.h>
/*
主要c
*/
void I2C_Initialize (void);
void I2C_Transmit (void);
void I2C_receive (void);
Int TransmitByteCtr = 8;
unsigned char PointerRxData;//指向RX数据的指针
Int Rx = 0;
unsigned char TX_data[8]={0x2A, 0x00, 0x89, 0x2A, 0x00, 0x09,0x2A,0x03};
INT MAIN ( void )
{
WDTCTL = WDTPW + WDTHOLD;//停止WDT
//disable_INT;//禁用所有中断
//ClockInitialize();
//两者都是端口1:端口1.6 端口1.7 位是使用端口寄存器为I2C设置的,SDA = 1.7 WFP SCL = 1.6 //
P1DIR |= 0xC0;
P1SEL || BIT6 + BIT7;//将I2C引脚分配给USI_B0 //
P1SEL2|= BIT6 + BIT7;//将I2C引脚分配给USI_B0
I2C_Initialize();
同时(1)
{
//传输过程
Rx = 0;
I2C_Transmit();
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
//接收过程
Rx = 1;
I2C_receive();
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
}
}
//------------------
// USI_B0数据ISR用于移动从I2C从属设备接收的数据
//至MSP430内存。 它的结构可以用于接收
//------------------
#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX_ISR(void)
{
如果(Rx == 1)
{//主中继器接收?
PointerRxData = UCB0RXBUF;//获取RX数据
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出LPM0
}
否则
{//主传输
IF (TransmitByteCtr <8)//检查TX字节计数器
{
UCB0TXBUF = TX_DATA[TransmitByteCtr ];//加载TX缓冲区
TransmitByteCtr ++;// Decrement TX字节计数器
}
否则
{
UCB0CTL1 || UCTXSTP;// I2C停止条件
IFG2 &=~UCB0TXIFG;//清除USI_B0 TX int标志
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出LPM0
}
}
}
Void I2C_Initialize (void)(Void I
{
IE2 |= UCB0RXIE;//启用RX中断
IE2 |= UCB0TXIE;//启用TX中断
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
UCB0CTL1 || UCSWRST;//启用软件重置
UCB0CTL0 = UCMST + UCMODE_3 + UCSNC;// I2C主控,同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用SMCLK,保持SW重置
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x2A;//从属地址为02Ah
UCB0CTL1 &=~UCSWRST;//清除软件重置,恢复操作
}
void I2C_Transmit (void)
{
// while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
UCB0CTL1 || UCTR + UCTXSTT;// I2C TX,启动条件
__bis_sr_register(CPUOFF + GIE);//输入带中断的LPM0
}
void I2C_receive (void)
{
UCB0CTL1 &=~UCTR;//清除UCTR
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
UCB0CTL1 || UCTXSTT;// I2C启动条件
While (UCB0CTL1和UCTXSTT);//启动条件已发送?
UCB0CTL1 || UCTXSTP;// I2C停止条件
__bis_sr_register(CPUOFF + GIE);//输入带中断的LPM0
}
一
