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.

[参考译文] CCS/MSP430FR5969:通过I2C将MSP430FR5969与ADXL345连接起来

Guru**** 2301870 points
Other Parts Discussed in Thread: MSP430FR5969
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/579156/ccs-msp430fr5969-interfacing-msp430fr5969-with-adxl345-via-i2c

部件号: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启动条件
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Rudy,

    有关调试I2C问题,请参阅以下应用说明 。www.ti.com/.../slaa734
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Rudy,

    上述应用说明是否有助于解决您的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jace:

    感谢您的回复。

    我仍在测试新的更改,但尚未成功读取ADXL345。 我会在取得更多进展后再回覆。

    -Rudy