请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430FR2311 工具/软件:Code Composer Studio
Howdy,
我正在尝试将MSP430FR2311 Launchpad连接到 评估板上的加速计(www.invensense.com/.../)。 到目前为止,我在通过I2C配置加速计方面取得了0成功。 我认为问题可能出在我的I2C配置上,特别是时钟,但是我不确定。 如果有人能查看我正在使用的代码,或者将我指向有用的信息,我将非常感谢。
我为测试创建的这个代码示例应该写入加速度计的寄存器,并对其进行编程,以便在检测到少量力时生成中断。 中断被发送回MSP430,并触发一个LED以打开。
//包括
#include <MSP430.h>
//设置全局变量
int TXByteCtr _I2C;
unsigned RXchar Data_I2C = 0;//对于I2C
const unsigned char TXData_I2C[]=
{//
禁用SPI模式
0x70, //选择寄存器112 I2C/SPI模式
0x00, //写入寄存器:
//config寄存器
0x1A, //选择寄存器26,配置寄存器
0x00, //写入寄存器,旧数据覆盖FIFO
0x1B, //选择寄存器27,Gyro_Config
0x00, //写入寄存器
0x1C, //选择Register 28,Accel_Config
0x00, //写入寄存器
0x1D, //选择寄存器29,Accel_Config 2
0x38, //写入寄存器平均32个样本
0x1E, //选择寄存器30,gyro lpm config
0xF0, //写入寄存器打开gyro LPM并设置128x平均滤波
器//唤醒运动阈值寄存器
0x20, //选择Register Wake on Motion therh x axis
0x01, //写入寄存器
0x21, //选择Register wake on motion threshold y axis
0x01, //写入寄存器
0x22, //选择Register wake on motion threshold z axis
0x01, //写入到寄存
器//FIFO数据? 在
0x23中, //选择寄存器35 FIFO启用
0x18, //写入寄存器设置为获取所有数据
//INT PIN (对于int状态为reg 58) pg 41
0x37, //选择寄存器55,int pin config
0x70, //写入到寄存器:活动高(70)//
运动唤醒,第45
页0x69, //选择寄存器105
0x80, //写入寄存器:WOM,带中断或模式
0x6A, //选择Register 106 User Control
0x00, //写入寄存器:禁用FIFO
0x6B, //选择寄存器107电源管理1
0x39, //写入寄存器:温度传感器被禁用,通过SMPLRT_DIV
0x6C自动确定休眠/待机, //选择Register 108 Power Mgt 2
0x00 //写入注册:gyro的XYZ和accel已通电
};
//列出函数
void ConfigI2(void);
void StartAccelConfig(void);
void ConfigPinINT(void);
//主
int (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
_DINT(); //禁用全局中断
//根据MCLK设备数据表的要求配置一个FRAM等待状态
//在配置时钟系统之前运行超过8MHz。
FRCTL0 = FWPW | NWAITS_2;//更改naccess-x值以添加适当数量的等待权,FWPW是FRAM写入密码
// LED的设置引脚
P1OUT &=~BIT0; //清除WFP 1.0 输出闩锁,以确定开机状态
P1DIR || BIT0; //将WFP 1.0 设置为输出方向
P2OUT &=~BIT0; //清除WFP 1.0 输出闩锁,以确定开机状态
P2DIR || BIT0; //将WFP 1.0 设置为输出方向
//调用初始化/配置功能
ConfigPinINT();
ConfigI222();
PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式以激活
_EINT(); //启用全局中断
//运行
StartAccelConfig();//必须在Config I2C // Setup Accelerometer Registers through SPI
//(WHOILE1)
while (1){}//End
Main
void ConfigPinINT(void){之后
//config pin 2.1 for interrupt from ACC
P2OUT |= BIT1; //将WFP 2.1 配置为上一个
P2REN |= BIT1; // WFP 2.1 上拉寄存器启用
P2IES &=~BIT1; // WFP 2.1 Active High
P2IE |= BIT1; //已启用WFP 2.1 中断
P2IFG &=~BIT1; //已清除WFP 2.1 IFG
//_EINT();
}
Void ConfigI2(void){
//配置GPIO
P1OUT &=~BIT0; //清除WFP 1.0 输出闩锁
P1SEL0 || BIT2 | BIT3; // I2C引脚
//为I2C模式配置USI_B0
CSCTL2 = 0x4000;
UCB0CTLW0 |= UCSWRST; //软件重置已启用
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC |UCSLA10;// I2C模式,主模式,同步,7位地址模式
UCB0CTLW1 |= UCASTP0 | UCCLTO_2; //未生成自动停止
//在到达UCB0TBCNT之后
UCB0BRW = 0x0008; //波特率= SMCLK / 8
//UCB0TBCNT = 0x0005; //要接收的字节数
UCB0I2CSA = 0x68; //从属地址
UCB0CTL1 &=~UCSWRST;
UCB0IE || UCRXIE | UCNACKIE | UCBCNTIE | UCTXIE;
}
void StartAccelConfig(void){//
开始通信
同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0CTLW0 |= UCTR | UCTXSTT; // I2C启动条件
__bis_sr_register(LPM0_bits|GIE); //输入LPM0 w/中断
}//I2C
ISR矢量
#pragma矢量= USI_B0_Vector
__interrupt void USBIB0_ISR(void)
{
SWITCH(__偶 数_in_range(UCB0IV, USI_I2C_UCBIT9IFG))){
案例USI_NONE:中断; //矢量0:无中断
案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG
案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG
UCB0CTL0 |= UCTXSTT; // I2C (重新)启动条件
中断;
案例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: //矢量24:RXIFG0
RXData_I2C = UCB0RXBUF; //获取RX数据
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
中断;
案例USI_I2C_UCTXIFG0:
IF (TXByteCtr _ I2C!= 50){
用于(TXByteCtr _I2C=0;TXByteCtr _I2C < 29;TXByteCtr _I2C++) //检查TX字节计数器
{
同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
UCB0TXBUF = TXData_I2C[TXByteCTR_I2C]; //加载TX缓冲区
//P2OUT ^= BIT0;
}
UCB0CTLW0 |= UCTXSTP; // I2C停止条件
UCB0IFG &=~UCTXIFG; //清除USI_B0 TX int标志
TXByteCtr _I2C=50;
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //退出LPM0
P1OUT || BIT0;
}
中断; //矢量26:TXIFG0
案例USI_I2C_UCBCNTIFG: //矢量28:BCNTIFG
中断;
案例USI_I2C_UCCLTOIFG:中断; //向量30:时钟低超时
案例USI_I2C_UCBIT9IFG:中断; //矢量32:第9位
默认值:break;
}//
Port 2中断服务例程
#pragma vector=port2_vector
__interrupt void Port_2(void)
{
//P1OUT |= BIT0; //切换LED以进行测试
P2OUT |= BIT0;
P2IFG &=~BIT1; //清除WFP 1.3 IFG
//__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);//退出LPM3
}