This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我为MSP430FR5969和加速计 ADXL345之间的I2C通信编写了一个代码。
当我运行代码时,它只工作一次。 我的意思是,我一次只从ADXL345接收一个数据。 之后,它不再起作用。 有人可以对此给出任何想法吗?
在整个代码下面:
#include <MSP4S.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];
void Setup_TX(unsigned char);
void Setup_Rx (unsigned char);
void transmit (unsigned char,unsigned char);
void TransmitOne(unsigned char);
接收无效(无效);
////////
int main (void){
WDTCTL = WDTPW | WDTHOLD;
P1DIR || BIT0;
//P1OUT |= BIT0;
P1OUT &=~BIT0;
//P1SEL || BIT6 | BIT7;// ADXL345
P1SEL1 || BIT6 | BIT7;// ADXL345
//P1SEL0 &=~(BIT6 |位7);// ADXL345
//P1SEL2 || BIT6 | BIT7;// ADXL3450
PM5CTL0 &=~LOCKLPM2;
//为ADXL345初始化序列
SETUP_TX (ADXL_345);
Transmit (0x2D,0x00);//00
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
SETUP_TX (ADXL_345);
Transmit (0x2D,0x10);//16
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
SETUP_TX (ADXL_345);
Transmit (0x2D,0x08);//08
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
//P1OUT ^=BIT0;
而(1){
SETUP_TX (ADXL_345);
TransmitOne(0x32); //从ADXL345请求数据,2g范围10位分辨率
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
//接收过程
SETUP_RX (ADXL_345);
receive();
while (UCB0CTL1和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周期(10); //延迟1秒
//UCB0CTLW1 &=~UCTXSTP;
}//Fin While (1)
}//FIN主菜单
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void){
如果(RX == 1){ //主接收?
RXByteCtr --; // Decrement RX字节计数器
如果(RXByteCtr){
*PRxData++= UCB0RXBUF; //将RX数据移动到PRxData地址
其他{
UCB0CTL1 || UCTXSTP; //不重复启动:停止条件
*PRxData++= UCB0RXBUF; //将最终RX数据移至PRxData
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //退出LPM0
}}
Else{ //主传输
IF (TXByteCtr){// 检查TX字节计数器
TXByteCtr -; // Decrement TX字节计数器
UCB0TXBUF = MSData[TXByteCtr ]; //加载TX缓冲区
其他{
UCB0CTL1 || UCTXSTP; // I2C停止条件
UCB0IFG &=~UCTXIFG; // Clear USI_B0 TX int flag //UCTXIFG0是在UCBxTXBUF在主模式或从模式中为空时设置的
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //退出LPM0
}
}//fin (如果有)
}
////////////////////////////////
void Setup_TX(unsigned char Dev_ID){
_DINT();
Rx=0;
UCB0IE &=~UCRXIE;
UCB0CTLW1 &=~UCTXSTP;//MOIIIIIIIII
While (UCB0CTL1和UCTXSTP);
//UCB0CTLW0 |= UCSWRST;
//UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2 | UCSYNC;
//UCB0CTLW1 = UCASTP_2 | UCSWRST; //生成自动停止
UCB0CTLW0 |= UCSWRST;
UCB0CTLW0 |= UCMODE_3| UCMST | UCSYNC |UCSSEL_2;
UCB0CTLW1 = UCASTP_2; //生成自动停止
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 =0;
UCB0TBCNT=0x0006;
UCB0I2CSA = Dev_ID;
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCTXIE;//| UCNACKIE | UCBCNTIE;
}
void Setup_Rx (unsigned char Dev_ID){
_DINT();
Rx = 1;
UCB0IE &=~UCTXIE;
//UCB0CTLW0 |= UCSWRST; //启用软件重置
//UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2 | UCSYNC;
//UCB0CTLW1 = UCASTP_2 | UCSWRST; //使用SMCLK,保持SW重置
UCB0CTLW0 |= UCSWRST;
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCSSEL_2;
UCB0CTLW1 = UCASTP_2; //生成自动停止
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
//UCB0TBCNT=0x0006;
UCB0I2CSA = Dev_ID; //从属地址为048h
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
UCB0IE |= UCRXIE;//| UCNACKIE | UCBCNTIE;
}
void Transmit (unsigned char ReG_Add,unsigned char ReG_DAT){
MSData[1]=注册_添加;
MSData[0]=注册日期;
TXByteCtr = NUM_Bytes_TX; //加载TX字节计数器
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
//UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件
UCB0CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件
__bis_sr_register (LPM0_BITS | GIE);
/*while (1){
__delay_cycles (2000年);
同时(UCB0CTL1和UCTXSTP);
UCB0CTL1 || UCTXSTT;
__bis_sr_register (LPM0_BITS | GIE);
}*/
}
Void TransmitOne (无符号char ReG_Add){
MSData[0]=注册_添加;
TXByteCtr = 1; //加载TX字节计数器
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
//UCB0CTL1 || UCTR | UCTXSTT; // I2C TX,启动条件
UCB0CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件
__bis_sr_register (LPM0_BITS | GIE);
/*while (1){
__delay_cycles (2000年);
同时(UCB0CTL1和UCTXSTP);
UCB0CTL1 || UCTXSTT;
}*/
}
作废接收(作废){
PRxData =(unsigned char *)RxBuffer; // RX缓冲区的开始
RXByteCtr = NUM_Bytes_RX; //加载RX字节计数器
while (UCB0CTL1和UCTXSTP); //确保已发送停止条件
//UCB0CTL1 || UCTXSTT; // I2C启动条件
UCB0CTLW0 |= UCTXSTT;
UCB0CTLW0 &=~UCTR;
//while (UCB0IFG和UCNACKIFG);
__bis_sr_register (LPM0_BITS | GIE);
}
您好Darwin:
在尝试查找项目内部的错误时,一个很好的资源是将其与我们发布的示例代码进行比较,以了解差异所在。 下面是指向MSP430FR5969示例代码( http://dev.ti.com/tirex/#/?link=Software%2FMSP430Ware%2FDevices%2FMSP430FR5XX_6XX%2FMSP430FR5969 % 2FPeripheral %20Examples%2FRegister %20Level )的链接,您可以在其中找到多个I2C示例项目。 虽然示例项目必须是通用的,不能直接作为插件并适合所有实现,但它们是查看代码流,正确初始化和用例的好工具。
另一个很好的资源是“应用报告” ,它侧重于MSP430 MCU ( http://www.ti.com/lit/an/slaa734/slaa734.pdf )上常见串行通信问题的解决方案。
希望这为您找到问题提供了一个坚实的起点。 如有任何更新,请随时联系我们!
此致,
Matt Calvo