请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430FR5969 工具/软件:Code Composer Studio
您好,
我在使用 MSP430FR5969 Launchpad配置ADXL345加速计时遇到困难。
我一直在关注 发布在此处的类似解决方案。 我认为连接是相同的:
GND -> GND
VCC -> VCC
cs -> VCC
SDO -> GND
SDA -> WFP 1.7 (带有4.7K上拉电阻)
SCL -> WFP 1.6 (带有4.7K上拉电阻)
运行调试后,我的缓冲区似乎从未填满。 所以我想我初始化的东西不正确。
我的一位同事提到我可能需要添加时钟初始化过程?
我在Arduino上测试了ADXL345,它工作正常,所以我不认为这是硬件问题。
欢迎您提出任何建议,谢谢。
我已将我对代码的修改附在此处:
#include <MSP430-h> #define NUM_Bytes_TX 2 #define NUM_Bytes_RX 6 #define ADXL_345 0x53 int RXByteCtr,x,y,z; volatile unsigned char RxBuffer[6]; //分配6字节的RAM unsigned char *PRxData; //指向RX数据 的指针unsigned char TXByteCtr,RX = 0; unsigned char MSData[2]; // I2C void Setup_TX(char)函数; void Setup_RX(unsigned char); void transmitOne(unsigned char); void receive (void); int main(void) { unsigned Setup_RXTTL= wDT/wDTWDTWDT/=~ wDTWDTWDT/WD0; wD; wD; wDTWDTWDTWDT/= //清除WFP 1.0 输出锁P1DIR |= BIT0;// WFP 1.0 =红色LED P1OUT |= BIT0;// WFP 1.0 =红色LED P1SEL1 |= BIT6 + BIT7; // I2C引脚 //禁用GPIO通电默认高阻抗模式以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPPM5; // ADXL345 Setup_TX (ADXL_345)的初始序列; 传输(0x2D,0x00); 时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 Setup_TX (ADXL_345); 传输(0x2D,0x10); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 Setup_TX (ADXL_345); 传输(0x2D,0x08); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件在 (1){时发送 //传输过程 SETUP_TX (ADXL_345); TransmitOne (0x32); //从ADXL345请求数据,2g范围10位分辨率 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 //接收过程 SETUP_RX (ADXL_345); receive(); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 x =((((int)RxBuffer[1])<8)| RxBuffer[0]; Y =((((int)RxBuffer[3])<8)| RxBuffer[2]; Z =((((int)RxBuffer[5])<8)| RxBuffer[4]; //现在我们有x,y,z读数。 //如果x或y角度超过45度或小于-45度,则下方红色LED亮起。 如果((x > 128)||(y > 128)||(x <-128)||(y <-128)){ P1OUT || BIT0;//红色LED亮起 } 否则{ P1OUT >=~BIT0;//红色LED熄灭 } __delay_cycles(100万);//延迟1秒 }}//------------------ // I2C //---------------------------------- #pragma vector = USI_B0_vector __interrupt void USI_B0_ISR(void) { IF(RX ==1){ //主中继器接收? RXByteCtr --; // Decrement RX字节计数器 IF (RXByteCtr) { *PRxData++= UCB0RXBUF; //将RX数据移至地址PRxData } 否则 { UCB0CTLW1 |= UCTXSTP; //不重复启动:停止条件 *PRxData++= UCB0RXBUF; //将最终RX数据移至PRxData __BIC_SR_REGISTER_ON_EXIT (LPM0_BITS | GIE);//退出LPM0 }} 否则{ //主传输 IF (TXByteCtr) //检查TX字节计数器 { TXByteCtr // Decrement TX字节计数器 UCB0TXBUF = MSData[TXByteCtr ]; //加载TX缓冲区 } 否则 { UCB0CTLW1 |= UCTXSTP; // I2C停止条件 UCB0IFG &=~UCTXIFG; //清除USI_B0 TX int标志 __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE); //退出LPM0 } } } void Setup_TX(unsigned char Dev_ID){ _DINT(); RX =0; UCB0IE &=~UCRXIE;// 禁用USCI_B0 RX中断,同时(UCB0CTLW1 & UCTXSTP); //确保已发送停止条件//禁用RX中断 UCB0CTLW1|= UCSWRST; //启用软件重置 UCB0CTLW0 = UCMODE_3 | UCMST | UCSYNC; // I2C主控,同步模式 UCB0CTLW1 = UCSSEL_2; //使用SMCLK,保持软件重置 UCB0BR0 = 0x0008; //波特率= SMCLK / 8 UCB0TBCNT = 0x0006; //要接收的字节数 UCB0I2CSA = Dev_ID; //从属地址为048h UCB0CTLW1 &=~UCSWRST; //清除软件重置,恢复操作 UCB0IE |= UCTXIE | UCNACKIE | UCBCNTIE; //启用TX中断 } void Setup_RX(unsigned char Dev_ID){ _DINT(); RX =1; UCB0IE &=~UCRXIE;//禁用USSCI_B0 RX中断 UCB0CTLW1|= UCSWRST; //启用软件重置 UCB0CTLW0 = UCMODE_3 | UCMST | UCSYNC; // I2C主控,同步模式 UCB0CTLW1 = UCSSEL_2; //使用SMCLK,保持软件重置 UCB0BR0 = 0x0008; //波特率= SMCLK / 8 UCB0TBCNT = 0x0006; UCB0I2CSA = Dev_ID; //从属地址为048h UCB0CTLW1 &=~UCSWRST; //清除软件重置,恢复操作 UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE; //启用RX中断 } void传输(unsigned char ReG_Add,unsigned char ReG_DAT){ MSData[1]= ReG_Add; MSData[0]= ReG_DAT; TXByteCtr = NUM_Bytes_TX; //加载TX字节计数 器,同时(UCB0CTLW1 & UCTXSTP); //确保停止条件已发送 UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件 ,同时(1) { __delay_cycles (2000年); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 UCB0CTLW1 |= UCTXSTT; // I2C启动条件 } } void TransmitOne(unsigned char ReG_Add){ MSData[0]= ReG_Add; TXByteCtr =1; //加载TX字节计数 器,同时(UCB0CTLW1 & UCTXSTP); //确保停止条件已发送 UCB0CTLW1 |= UCTR + UCTXSTT; // I2C TX,启动条件 ,同时(1) { __delay_cycles (2000年); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 UCB0CTLW1 |= UCTXSTT; // I2C起始条件 } } void receive(void){ PRxData =(unsigned char *)RxBuffer;// RX缓冲区的起始 RXByteCtr = NUM_Bytes_Rx; //加载RX字节计数 器,同时(UCB0CTLW1 & UCTXSTP); //确保停止条件已发送 UCB0CTLW1|= UCTXSTT; // I2C启动条件 ,同时(1) { __delay_cycles (2000年); 同时(UCB0CTLW1和UCTXSTP); //确保停止条件已发送 UCB0CTLW1 |= UCTXSTT; // I2C启动条件 }