主题中讨论的其他器件: MSP430WARE
工具/软件:Code Composer Studio
我正在与 MSP430F67621A 一起开发一个项目、在该项目中、我需要从两个 MSP430向基于 Linux 的主机发送数据。 这三个器件通过 SPI 进行连接、并具有从 Linux 主机到每个 MSP430的片选线路。 Linux 主机是 SPI 主器件、MSP430是从器件。
我看到了一个奇怪的问题、如果我在3引脚 SPI 从模式下配置 MSP430 eUSCI 模块、一切看起来都正常、 但是当我尝试使用4引脚模式时、MSP430只在第一次响应主器件-之后每次从器件都不响应。 (请注意、虽然我有两个 MSP430可供使用、但此示例仅在其中一个 MSP430上运行、第二个 MSP430被禁用)。
我在一次从主器件传输中读取的字节数量似乎无关紧要、我总是在第一次获取数据、然后在后续传输中获取零。 我已经将 STE 引脚映射到 P2.7。
我已经设置了一个演示问题的基本 Code Composer Studio 项目、这是 main.c 文件:
#include #include #include uint8_t send_Bytes[]=\ { 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x01、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x02、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x03、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x04、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x05、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x06、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x07、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x08、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x09、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0A、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0B、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0C、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0D、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0E、 0xAA、0xBB、0xCC、0xDD、0xEE、 0xFF、0x11、0x0F }; const uint8_t SEND_Len = 120; uint8_t SEND_CTR = 0; int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 //启用全局中断 _bis_SR_register (GIE); //将 SPI 引脚配置为辅助功能模式 P1SEL |= BIT4 | BIT4;// P1.4 + P1.5 (UCA1SOMI、UCA1SIMO) P2SEL |= BIT4; // P2.4 (UCA1CLK) //配置 SPI 'STe'引脚 PMAPPWD = PMAPPW; //启用写入访问以修改端口映射寄存器 P2SEL |= BIT7; //将 P2.7设置为辅助功能模式 P2MAP7 = PM_UCA1STE;//映射到 UCA1STE 函数 //将 USCI 状态机置为复位状态,以便更改选项 UCA1CTLW0 = UCSWRST; /* * UCA1CTLW0:USCI_A1控制寄存器 *位字段表示以下内容: * UCCKPH:时钟相位选择 * UCCKPL:时钟极性选择 * UCMSB:MSB 优先选择 * UC7BIT:字符长度 * UCMST:主控模式选择 * UCMODEx:USCI 模式 * UCSYNC:同步模式使能 * UCA1CTLW0 = UCCKPH |// 1b =数据在第一个 UCLK 边沿上被捕捉并在下一个边沿上被改变 //UCCKPL |// 0b =无效状态为低电平 UCMSB |// 1b = MSB 优先 //UC7BIT |// 0b = 8位数据 //UCMST |// 0b =从机模式 UCMODE_2 |// 10b = UCxSTE 低电平有效的4引脚 SPI:当 UCxSTE = 0时、从器件被启用 UCMODE_0 |// 00b = 3引脚 SPI UCSYNC; // 1b =同步模式 /* * UCA1BR0:USCI_A1比特率控制寄存器0 * UCA1BR1:USCI_A1比特率控制寄存器1 *位时钟预分频器字节。 的16位值 *(UCA1BR0 + UCA1BR1×256)组成预分频器 *值 UCBR1。 * UCA1BR0 = 0x02; UCA1BR1 = 0; //使 USCI 状态机脱离复位状态、使用给定的选项启动它 UCA1CTLW0 &=~UCSWRST; /* * UCA1IE:USCI_A1中断使能寄存器 * UCTXIE:发送中断使能 * UCRXIE:接收中断使能 * UCA1IE |= UCRXIE;//启用 RX 中断 // UCA1IE |= UCTXIE;//启用 TX 中断 } // USCI_A1中断矢量服务例程。 #if defined (__TI_Compiler_version__) #pragma vector=USCI_A1_vector __interrupt #elif defined (__GNU__) __attribute__((interrupt (USCI_A1_vector))) #endif void USCI_A1_ISR (void) { 开关(_偶数_IN_RANGE (UCA1IV、2)){ //Vector 2 - RXIFG 案例2: //等待 USCI_A1 TX 缓冲区准备就绪 while (!(UCA1IFG & UCTXIFG)); //通过 SPI 发送 UCA1TXBUF = SEND_Bytes[SEND_CTR]; SEND_CTR +; if (send_CTR > send_len){ SEND_CTR = 0; } 中断; 默认值:break; } }
编辑:示例中更新了数组和长度
在 eUSCI 模块被 STE 引脚作为从器件触发后、我是否需要执行一些操作来重新启用它?