下面是我用于初始化系统的一些设置函数:
void accel_init(){//
P4.0和4.1上 I2C 的 PIN 配置。 注4.0是 SDA、4.1是 SCL
P4SEL1 |=(SDA | SCL);
P4SEL0 &=~(SDA | SCL);
UCB1CTLW0 |= UCSWRST;//此命令启用 UCB 的设置。
UCB1CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCSSEL_2;//I2C 模式|主器件|同步| SMCLCK
UCB1CTLW0 &=~
^UCTR;//接收数据模式 UCB1CTLW1 |= UCSTP_2;//自动生成的停止条件 UCB1CTLW0 = 3.1BRW = 3、UCB331BR1 = 3;/设置为
3;UCB331BR1 = 1 = 1 = 1 = 1 / 1 = 1;//
UCB1TBCNT = 1;//一次发送一个字节到从
器件 UCB1I2CSA = 0x26;//从器件的地址。
UCB1CTLW0 &=~UCSWRST;//禁用 UCB 设置。
//中断:
UCB1IE |= UCRXIE | UCNACKIE | UCBCNTIE | UCSTPIE;//当前接收中断| NACK 中断| cnt 值到达中断|开始中断
}
void initMSP430 (void){
/******* 测试数据发生器1kHz ***** /
P9DIR |= BIT1 | BIT2 | BIT3 | BIT4;//测试数据输出
TA2CTL = tassel__SMCLK | MC__Continous | TACLR;
TA2CCR1 = 1000; // 1MHz * 1/1000Hz
TA2CCTL1 = CCIE; //启用中断
testcnt = 0; //开始测试计数器为0
/********* PWM 背光******** /
P1DIR |= BIT3;
P1SEL0 |= BIT3;
P1SEL1 &=~BIT3;
TA1CCR0 = 511;
TA1CCTL2 = OUTMOD_7;
TA1CCR2 = 255;
TA1CTL = tassel__ACLK | MC__UP | TACLR;
/******** SPI /
P2DIR |= LCD_CS_PIN;// DC 和 CS
P4DIR |= LCD_DC_PIN;
P1SEL0 |= LCD_MOSI_PIN | LCD_UCBCLK_PIN; // MOSI 和 UCBOCLK
P1SEL1 &=~(LCD_MOSI_PIN | LCD_UCBCLK_PIN);
UCB0CTLW0 |= UCSWRST;//重置 UCB0
/*
* UCBxCTLW0- eUSCI_Bx 控制寄存器0
* UCSSEL__SMCLK -主控模式下的 SMCLK
* UCCKPL-时钟极性选择
* UCMSB- MSB 优先选择
* UCMST-主控模式选择
* UCMODE_0 - eUSCI 模式3引脚 SPI 选择
* UCSYNC-同步模式使能
*
//UCB0CTLW0 |= UCSSEL__SMCLK | UCCKPL | UCMSB | UCMST | UCMODE_0 | UCSYNC;
UCB0CTLW0 |= UCSSEL_SMCLK | UCCKPH | UCMSB | UCMST | UCMODE_0 | UCSYNC;
// UCB0CTLW0 = UCCKPH + UCMSB + UCMST + UCSYNC + UCSSEL_2;// 3引脚8位 SPI 主
器件 UCB0BR0 |= 0x01; //时钟= SMCLK/1
UCB0BR1 = 0;
UCB0CTL1 &=~Ω UCSWRST; //清除 UCSWRST 以释放 eUSCI 以运行
PM5CTL0 &=~LOCKLPM5;//从电源管理
器___ ENABLE_INTERRUPT ()解锁端口
;}
这是我的主要函数:
void main (void){ WDTCTL = WDTPW | WDTHOLD;//终止看门狗 initmsp430(); ACCEL_INIT(); __DELAY_CYCLES (10); /*现在的目标是在启用中断时发送所需的信息 *我将尝试使用 cnt 中断系统来执行此操作*/ UCB1CTLW0 |= UCTR | UCTXSTT;//开始发送 UCB1TXBUF = 0x01;//发送1 while (true){ P6DIR Δ^= BIT1;//诸如此类。 _nop()在这里也可能还不错 。} }
我只是想让 UCBCNTIFG 触发。 在调试模式下、永远不会抛出该标志。 我不明白为什么。 根据系列用户指南(第841页、2020年4月修订版)、此中断在主控模式下可用。 由于我已经设置了 UCB1TBCNT = 1、并且正在根据 UCB1CTLW1 |= UCASTP_2生成自动停止条件、所以它应该在发送一个字节后发生。 启用中断的是 accel_init()函数,并且在 initmsp430()函数中调用__enable_interrupt (),因此应设置 GIE。 我将系统设置为传输模式,并在 main()中调用 START 条件。 缓冲区可以包含任何内容、但恰好是0x01。
由于我要发送一个字节、并且 UCB1连接到 smclk、我的预期是、它需要大约8个时钟周期才能发送一个字节。 因此、中断标志应该会在该时间附近、它应该会进入我的 ISR (这是一个无限 while 循环、我在调试器中遇到了断点)。 但是、它不会。 中断根本不会触发、我不明白为什么。 相反,该程序会进入仅切换未使用引脚方向的 main() while ()循环。
有人能不能对此有所了解? 对于我的器件、在尝试 I2C 通信时无法触发任何中断标志、我担心在设置中做了一些不当操作。 我无法排除硬件问题、但如果标志应该出现在这里、并且软件没有任何问题、那么这就意味着硬件问题。
如果有任何帮助,将不胜感激。
