主题中讨论的其他部件:TMP275,
借助 I2C协议,我拥有一个带MSP430FR2311的TMP275温度传感器接口。
以下代码滞留在第一个功能的TX ISR中。
请检查我的代码是否正确 ,或者是否需要进行任何修改才能正常工作。
#include <msp430fr2311.h>
//unsigned int Slaver_Address[3]={0x0048,0x0048,0x004A};
//int Slave_Flag;
无符号int TxData[3];
无符号int RX_Data[2];
Int Tx计数器;
Int RX_Counter;
无符号int TX_Int_Counter;
无符号int Rx_Int_Counter;
//volatile int ReG_Add1;
void TX_Data_of_Data_Demand (unsigned int ReG_Add);
void TX_Data_Format_bit (unsigned int ReG_Add,unsigned int ReG_Data);
内部主(无效)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
//为I2C配置引脚
P1SEL0 || BIT2 | BIT3;// I2C引脚
//禁用GPIO开机默认高阻抗模式
//以激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM2;
//为I2C模式配置USI_B0
UCB0CTLW0 |= UCSWRST;//将eUSSCI_B置于重置状态
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C主模式,SMCLK
UCB0BRW = 0x8;//波特率= SMCLK / 8
UCB0I2CSA = 0x0048;
UCB0CTLW0 &=~UCSWRST;//清除重置寄存器
__bis_sr_register (GIE);
TX_Data_Format_bit (0x01,0x20);//配置寄存器
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
同时(1)
{
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
TX_Data_of_Data_Demand (0x00);
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
}
}
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USCIB0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector))) USCIB0_ISR (void)
#否则
错误编译器不受支持!
#endif
{
Switch(__偶 数_in_range(UCB0IV,USI_I2C_UCBIT9IFG))
{
案例USI_NONE:Break;// Vector 0:no interrupt break;
案例USI_I2C_UCALIFG:中断;
案例USI_I2C_UCNACKIFG:
UCB0CTL1 |= UCTXSTT;//如果不符合,请重新发送启动
中断;//向量4:NACKIFG中断;
案例USI_I2C_UCSTIFG:中断;//矢量6:STTIFG中断;
案例USI_I2C_UCSTPIFG:中断;//矢量8:STPIFG中断;
案例USI_I2C_UCRXIFG3:中断;//矢量10:RXIFG3中断;
案例USI_I2C_UCTXIFG3:中断;//矢量14:TXIFG3中断;
案例USI_I2C_UCRXIFG2:中断;//矢量16:RXIFG2中断;
案例USI_I2C_UCTXIFG2:中断;//矢量18:TXIFG2中断;
案例USI_I2C_UCRXIFG1:中断;//矢量20:RXIFG1中断;
案例USI_I2C_UCTXIFG1:中断;//矢量22:TXIFG1中断;
案例USI_I2C_UCRXIFG0:
RX_Data[RX_Counter]= UCB0RXBUF;
RX_Counter++;
RX_Int_Counter++;
中断;//引导程序24:RXIFG0中断;
案例USI_I2C_UCTXIFG0://检查TX字节计数器
// ReG_Add1 = TxData[TX_Counter];
// IF (Tx计数器> 0)
//{
UCB0TXBUF = TxData[TX_Counter];
TX_计数器--;
TX_Int_Counter++;
//}
中断;//矢量26:TXIFG0中断;
案例USI_I2C_UCBCNTIFG:中断;//矢量28:BCNTIFG
案例USI_I2C_UCCLTOIFG:中断;//矢量30:时钟低超时
案例USI_I2C_UCBIT9IFG:中断;//矢量32:第9位
默认值:中断;
}
}
void TX_Data_Format_bit (无符号int ReG_Add,无符号int ReG_Data)
{
TX_计数器= 2;
//UCB0IE |= UCNACKIE;//传输和nack中断启用
TxData[2]= ReG_Add;
TxData[1]= ReG_Data;
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
UCB0IE || UCTXIE0;//清除USI_B0 TX int标志
//__bis_sr_register (GIE);
// While (Tx计数器> 0)
While (Tx计数器!= 0)
{
__no_operation();
}
UCB0CTLW0 |= UCTXSTP;
UCB0IE &=~UCTXIE0;//清除USSCI_B0 TX int标志
//UCB0IE &=~UCNACKIE;
}
Void TX_Data_of_Data_Demand (无符号int ReG_Add)
{
TX_计数器= 1;
TxData[1]= ReG_Add;
Rx_Counter = 0;
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
UCB0IE |= UCTXIE0;//传输和nack中断启用
While (Tx计数器!= 0)
{
__no_operation();
}
UCB0IE &=~UCTXIE0;//清除USSCI_B0 TX int标志
__no_operation();
//UCB0CTLW0 |= UCTXSTP;
//UCB0CTVALUE = UCB0CTLW0;
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |= UCTXSTT;// I2C TX,启动条件
UCB0IE |= UCRXIE0;//传输和nack中断启用
While (RX_Counter < 2)
{
__no_operation();
}
UCB0CTLW0 |= UCTXSTP;
UCB0IE &=~UCRXIE0;//清除USSCI_B0 TX int标志
__no_operation();
}