借助 I2C 协议、我有一个与 MSP430FR2311连接的 ADXL345接口。 以下代码正常工作、没有错误。 但是、我从传感器接收的数据是原始数据。 当我倾斜该传感器时、来自该传感器的数据保持不变。
每次接收 RX 缓冲区中的数据时:
RX_Data[0]= 0x22;
RX_Data[1]= 0x22;
RX_Data[2]= 0x00;
RX_Data[3]= 0x00;
RX_Data[4]= 0x00;
RX_Data[5]= 0x00;
在下一个周期中:
RX_Data[0]= 0x00;
RX_Data[1]= 0xFE;
RX_Data[2]= 0x00;
RX_Data[3]= 0xFE;
RX_Data[4]= 0x00;
RX_Data[5]= 0x00;
上述序列连续重复。
请检查我的代码是否正确 、或者是否需要进行任何修改才能正常工作。
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
#include
volatile unsigned char TxData[3];
volatile unsigned char RX_Data[6];
volatile int Tx_Counter;
int RX_Counter;
volatile unsigned int Tx_Int_Counter;
volatile unsigned int Rx_Int_Counter;
volatile unsigned char transmit [10];
volatile int Reg_Add1;
void TX_Data_for_Data_Demand (unsigned char Rer_Add);
void TX_Data_Format_bit (unsigned char Rer_Add、unsigned char Rer_Data);
unsigned int UCB0CTVALUE;
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
//为 I2C 配置引脚
P1SEL0 |= BIT2 | BIT3;// I2C 引脚
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//将 USCI_B0配置为 I2C 模式
UCB0CTLW0 |= UCSWRST;//将 eUSCI_B 置于复位状态
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 主控模式、SMCLK
UCB0BRW = 0x8;//波特率= SMCLK / 8
UCB0CTLW0 &=~ UCSWRST;//清除复位寄存器
UCB0I2CSA |= 0x0053;
_bis_SR_register (GIE);
//TX_Data_Format_Bit (0x2C、0x0A);//电源控制
// while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
TX_Data_Format_bit (0x2D、0x00);//电源控制
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
TX_Data_Format_bit (0x2D、0x08);//电源控制
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
TX_Data_Format_bit (0x31、0x00);//数据格式
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
while (1)
{
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
TX_Data_for_Data_Demand (0x32);
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
}
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCIB0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)
其他
错误编译器不受支持!
#endif
{
开关(__evo_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
{
案例 USCI_NONE:break;//向量0:无中断中断;
USCI_I2C_UCALIFG 案例:中断;
USCI_I2C_UCNACKIFG 案例:
UCB0CTL1 |= UCTXSTT;//如果 NACK,则重新发送开始
中断;//向量4:NACKIFG 中断;
case USCI_I2C_UCSTTIFG:break;//向量6:STTIFG break;
案例 USCI_I2C_UCSTPIFG:中断;//矢量8:STPIFG 中断;
案例 USCI_I2C_UCRXIFG3:中断;//向量10:RXIFG3中断;
案例 USCI_I2C_UCTXIFG3:中断;//向量14:TXIFG3中断;
案例 USCI_I2C_UCRXIFG2:中断;//向量16:RXIFG2中断;
案例 USCI_I2C_UCTXIFG2:中断;//向量18:TXIFG2中断;
案例 USCI_I2C_UCRXIFG1:中断;//向量20:RXIFG1中断;
案例 USCI_I2C_UCTXIFG1:中断;//向量22:TXIFG1中断;
USCI_I2C_UCRXIFG0案例:
RX_Data[RX_Counter]= UCB0RXBUF;
RX_Counter++;
RX_INT_Counter++;
中断;//向量24:RXIFG0中断;
案例 USCI_I2C_UCTXIFG0://检查 TX 字节计数器
// ReG_Add1 = TxData[Tx_Counter];
UCB0TXBUF = TxData[Tx_Counter];
TX_Counter --;
TX_INT_Counter++;
中断;//向量26:TXIFG0中断;
案例 USCI_I2C_UCBCNTIFG:break;//向量28:BCNTIFG
案例 USCI_I2C_UCCLTOIFG:中断;//矢量30:时钟低电平超时
案例 USCI_I2C_UCBIT9IFG:中断;//向量32:第9位
默认值:break;
}
}
void TX_Data_Format_bit (无符号字符 ReG_Add、无符号字符 ReG_Data)
{
TX_Counter = 2;
UCB0IE |= UCTXIE0| UCNACKIE;//发送和 NACK 中断使能
TxData[2]= ReG_Add;
TxData[1]= ReG_Data;
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
while (Tx_Counter!= 0)
{
__no_operation();
}
UCB0CTLW0 |= UCTXSTP;
UCB0IE &=~UCTXIE;//清除 USCI_B0 TX int 标志
}
void TX_Data_for_Data_Demand (无符号字符 Rer_Add)
{
TX_Counter = 1;
TxData[1]= Reg_Add;
RX_Counter=0;
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
UCB0IE |= UCTXIE0;//发送和 NACK 中断使能
while (Tx_Counter!= 0)
{
__no_operation();
}
UCB0IE &=~UCTXIE;//清除 USCI_B0 TX int 标志
UCB0CTLW0 |= UCTXSTP;
UCB0CTVALUE = UCB0CTLW0;
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |= UCTXSTT;// I2C TX、启动条件
UCB0IE |= UCRXIE0;//发送和 NACK 中断使能
while (RX_Counter<6)
{
__no_operation();
}
UCB0CTLW0 |= UCTXNACK | UCTXSTP;
UCB0IE &=~UCRXIE;//清除 USCI_B0 TX 内部标志
__no_operation();
}