您好!
我正在使用 Adafruit ADXL345加速计、问题是有时会触发中断以获取值、有时不会触发中断。 也就是说、它根本不会进入中断子例程。
为了接收 ODR (输出数据速率)、我们需要启用最低100kHz 的频率、FAST 为400kHz。 在这里、我启用 UCB2BRW = 2.5时钟为1MHz。 因此、1MHz/2.5 = 400kHz I AM 设置。
我仍然面临着这个问题。 我想知道我的问题所在。 我正在粘贴完整代码。 请帮助我解决问题。
#include
#include
#include
#include
#include
/**
* main.c
*
#define BMP280_ADDRESS 0x53
int m=0;
uint16_t BW_RATE [2]={0x2C、0x0F};
uint16_t POWER_CTL[2]={0x2D、0x08};
uint16_t Data_Format[2]={0x31、0x03};
uint16_t x1、y1、z1;
浮点 x2、Y2、Z2;
unsigned int OFCount;
uint16_t x、y、z=0;
int16_t XF、yf、ZF=0;
float xa、ya、za=0;
float f = 9.807;
uint8_t ADXL_ID=0;
uint16_t mBuffer[3];
uint8_t rxData=0;
int i、Index = 0、trans = 0、d = 500;
uint8_t nack_received;
uint8_t rxCount;
uint16_t rxBuffer[6];
uint8_t txCount;
uint16_t *txBuffer;
int clock_timeout=0;
uint8_t rx_data=2;
uint8_t str[4];
void i2cConfig (uint8_t stop_count)
{
UCB2CTLW0 = UCSWRST; //为 CONFIG 重置 I2C 接口
UCB2CTLW0 = // USCI - B2配置寄存器*/
UCMST |//主控模式
UCSYNC |//同步模式
UCMODE_3 |// I2C 模式
UCSSEL__SMCLK |//选择 SMCLK
UCTR |//发送器模式
UCSWRST |//不释放复位(尚未)
0;
UCB2CTLW1 =
UCCLTO_1 |//时钟低电平超时选择(28ms)
UCASTP_2 |//自动停止条件生成(已启用)
UCGLIT_0 |//去毛刺脉冲时间(50ns)
0;
UCB2TBCNT = STOP_COUNT;
UCB2BRW = 2.5; //位时钟分频器1M/2.5 = 400kHz
UCB2CTLW0 &=~UCSWRST; //清除复位位位以开始操作
UCB2IE = UCNACKIE |//启用 NACK 中断
UCTXIE |//启用 TX 中断
UCRXIE |//启用 RX 中断
UCCLTOIE |//启用时钟低电平超时中断
0;
//锁定 CS
}
void i2cConfig_read (uint8_t stop_count)
{
UCB2CTLW0 = UCSWRST; //为 CONFIG 重置 I2C 接口
UCB2CTLW0 = // USCI - B2配置寄存器*/
UCMST |//主控模式
UCSYNC |//同步模式
UCMODE_3 |// I2C 模式
UCSSEL__SMCLK |//选择 SMCLK
UCTR |//发送器模式
UCSWRST |//不释放复位(尚未)
0;
UCB2CTLW1 =
UCCLTO_1 |//时钟低电平超时选择(28ms)
UCASTP_0 |//自动停止条件生成(已启用)
UCGLIT_0 |//去毛刺脉冲时间(50ns)
0;
UCB2TBCNT = STOP_COUNT;
UCB2BRW = 2.5; //位时钟分频器1M/2.5 = 400kHz
UCB2CTLW0 &=~UCSWRST; //清除复位位位以开始操作
UCB2IE = UCNACKIE |//启用 NACK 中断
UCTXIE |//启用 TX 中断
UCRXIE |//启用 RX 中断
UCCLTOIE |//启用时钟低电平超时中断
0;
}
空初始化()
{
//配置 GPIO
P1OUT &=~BIT0;
P1DIR |= BIT0;
P6SEL1 &=(~BIT3);//为 GPIO 设置 P1.0 SEL
P6DIR |= BIT3;//将 P1.0设置为输出
P6OUT |= BIT3;//将 P1.0设置为高电平
P1OUT &=~BIT1;
P1DIR |= BIT1;
//--setup 端口
P7SEL1 &=~BIT1; //P7.1 = SCL
P7SEL0 |= BIT1;
P7SEL1 &=~BIT0; //P7.0 = SDA
P7SEL0 |= BIT0;
P7DIR &=~(BIT0 | BIT1);
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电高阻抗模式
// //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
// ////在配置时钟系统之前在8MHz 以上运行。
// FRCTL0 = FRCTLPW | NWAITS_1;
//
// //时钟系统设置
// CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
// CSCTL1 = DCOFSEL_4 | DCORSEL; //将 DCO 设置为16MHz
// CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO、
// // ACLK = VLOCLK
// CSCTL3 = DIVA__4 | DIVM_4 | DIVM_4; //将所有分频器设置为1以实现16MHz 运行
// __delay_cycles (60);
// CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //设置所有分频器
// CSCTL0_H = 0;
i2cConfig (0x01);
_bis_SR_register (GIE);
_enable_interrupt ();
}
void transmit (uint16_t *字段、uint8_t count){
i2cConfig (count);
UCB2I2CSA = BMP280_ADDRESS; //设置从器件地址
txCount = count;
txBuffer =字段;
UCB2CTLW0 |= UCTR | UCTXSTT; //作为发送器启动请求
}
void receive (uint16_t *字段、uint8_t 计数){
i2cConfig (count);
UCB2I2CSA = BMP280_ADDRESS; //设置从器件地址
rxCount =计数;
// rxBuffer =字段;
UCB2CTLW0 &=~UCTR; //将 I2C 总线置于接收模式
UCB2CTLW0 |= UCTXSTT; //作为接收器启动请求
}
void write (uint8_t reg、uint8_t data){
mBuffer[0]= reg;
mBuffer[1]=数据;
发送(mBuffer、2);
// for (i=0;i<50;i++);
}
void read (uint16_t reg、uint8_t size){
Transmit (、1);
接收(mBuffer、Size);
}
空 initTimer_A (空)
{
//Timer0_A3配置
TA0CCR0 = 62499; //计时器计数值为0.5秒;//初始,停止计时器
TA0CCTL0 |= CCIE;//为 CCR0启用中断。
TA0CTL = tassel_2 + ID_0 + MC_1;//选择 SMCLK、SMCLK/1、向上计数模式
}
空 delayMS()
{
if ((TA0CCTL0&TAIFG)!=0){ //监视标志状态
TA0CCTL0&=~(TAIFG); //清除标志
}
// OFCount = 0;//重置过流计数器
// TA0CCR0 = 1000-1;//启动计时器,比较向上计数模式的值以获得每个循环1ms 的延迟
// ////总计数= TACCR0 + 1。 因此、我们需要减1。
//
// while (i<=mss);
//
// TA0CCR0 = 0;//停止计时器
}
void power_cycle()
{
P6OUT ^= BIT3;
for (i=0;i<2000;i++);
P6OUT ^= BIT3;
}
//定时器 ISR
#pragma vector = TIMER0_A0_vector
_interrupt void Timer_A_CCR0_ISR (void)
{
OFCount++;//递增超流计数器
}
#pragma vector=USCI_B2_vector
_interrupt void USCIB2_ISR (void)
{
uint8_t rx_val = 0;
开关(__evo_in_range (UCB2IV、USCI_I2C_UCBIT9IFG))
{
案例 USCI_NONE: //无中断中断;
中断;
案例 USCI_I2C_UCALIFG: //仲裁丢失
中断;
案例 USCI_I2C_UCNACKIFG: //接收到 NAK (仅限主器件)
Nack_received = 1;
UCB2CTLW0 |= UCTXSTP; //当缺少应答时,从器件会得到一个停止条件
UCB2IFG &=~UCTXIFG;
// Acc_initial (); //根据需要重置 MCU。
中断;
案例 USCI_I2C_UCRXIFG0: // RXIFG0
P1OUT^= BIT1;
if (rxCount){
RX_val = UCB2RXBUF;
if (rxCount ==0)
{
UCB2CTLW0 |= UCTXSTP;
}
其他
{
rxBuffer[Index]= Rx_val; //获取 RX 数据
索引++;
rxCount--;
}
}
中断;
案例 USCI_I2C_UCTXIFG0: // TXIFG0
P1OUT^= BIT0;
UCB2TXBUF =*txBuffer++;
TRANS = 1;
中断;
案例 USCI_I2C_UCCLTOIFG: //时钟低电平超时-时钟保持低电平的时间过长
Clock_timeout = 1;
中断;
默认值:
中断;
}
}
void UART_Int (uint8_t *头、uint8_t temp)
{
int Index1=0;
如果(温度>100)
{
STR[Index]=(temp / 100)+ 48;
Indexx1++;
STR[Index]=(temp /10)+ 48;
Indexx1++;
STR[Index]=(温度% 10)+ 48;
UART_Transmit (HEAD);
UART_Transmit (str);
UART_TransmitOne ('\n');
UART_TransmitOne ('\r\n');
}
其他
{
STR[索引]=(temp /10 )+48;
索引++;
STR[指数]=(温度% 10)+48;
UART_Transmit (HEAD);
UART_Transmit (str);
UART_TransmitOne ('\n');
UART_TransmitOne ('\r\n');
}
}
void main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
初始化();
// initTimer_a();
// __enable_interrupt ();
// 读取(0x00、1);
UART_Init();
写入(0x2D、0x08);//电源控制
如果(TRANS_= 1)
{
UART_Transmit ("正在工作");
写入(0x2C、0x0A);//数据速率
写入(0x31、0x03);//数据格式
TRANS = 0;
}
其他
{
power_cycle();
UART_Transmit ("重启\n");
写入(0x2D、0x08);//电源控制
写入(0x2C、0x0A);//数据速率
写入(0x31、0x03);//数据格式
}
while (1)
{
读取(0x32、2);//数据 x
如果(nack_received = 1)
{
power_cycle();
写入(0x2D、0x08);//电源控制
写入(0x2C、0x0A);//数据速率
写入(0x31、0x03);//数据格式
读取(0x32、2);//数据 x
x1 =((rxBuffer[1])<< 8)| rxBuffer[0];
读取(0x34、2);//数据 y
Y1 =((rxBuffer[3])<< 8)| rxBuffer[2];
读取(0x36、2);//数据 z
Z1 =((rxBuffer[5])<< 8)| rxBuffer[4];
}
其他
{
UART_Transmit ("正在接收\n");
x1 =((rxBuffer[1])<< 8)| rxBuffer[0];
// UART_Int ("x1"、x1);
读取(0x34、2);//数据 y
Y1 =((rxBuffer[3])<< 8)| rxBuffer[2];
// UART_Int ("y1"、y1);
读取(0x36、2);//数据 z
Z1 =((rxBuffer[5])<< 8)| rxBuffer[4];
// UART_Int ("Z1"、Z1);
}
X2 =((浮点) x1)* 0.004 * f;
// delayMS (d);
Y2 =(((float) Y1)* 0.004 * f;
// delayMS (d);
Z2 =((float) Z1)* 0.004 * f;
// delayMS (d);
UART_Int ("x2=\n"x2);
UART_Int ("y2=\n",y2);
UART_Int ("Z2=\n"、Z2);
索引= 0;
// for (m=0;m<10000;m++);
}
}
我在通信之间没有使用任何延迟。
谢谢、