工具/软件:Code Composer Studio
大家好、我不熟悉 MSP430。 我使用的是 msp430f5529。 我尝试与型号为 mcp41010的电位计通信。
我修改了 SPI 示例代码、但它不起作用。 当我通过 SPI 更改电阻值时、与电位计串联的 LED 不会改变其亮度。
我使用与 Raspberry Pi 通信的同一电路、它工作正常。 我认为这是代码的问题。 可能我没有正确设置 MSP430上的 SPI。
以下是我的代码。
/*-版权所有-、BSD *版权所有(c) 2017、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 *--/copyrights-*/ #include "driverlib.h" //********* //! 此示例展示了 SPI 主器件如何使用3线模式与 SPI 从器件进行通信。 //! 递增数据由从0x01开始的主器件发送。 接收到的数据是 //! 预期与之前的传输相同。 USCI RX ISR 用于 //! 处理与 CPU 的通信、通常在 LPM0中。 如果为高电平、P1.0指示 //! 有效数据接收。 因为 LPM0之后的所有执行都在 ISR 中、 //! 初始化等待 DCO 相对于 ACLK 稳定。 //! ACLK =~32.768kHz、MCLK = SMCLK = DCO ~ 1048kHz。 BRCLK = SMCLK/2 //! //! 与 SPI 从器件数据回显代码示例一起使用。 如果从器件处于调试模式、则 P1.1 //! 从器件复位信号与从器件的 JTAG 冲突;要解决此问题、请使用 IAR 的//! 从器件上的"运行时释放 JTAG"。 如果在 //!中设置了断点 从器件 RX ISR、主器件也必须停止以避免从 器件//! RXBUF。 //! //! MSP430F5438A //! -------- //! /|\| | //! || | //! 主设备--+-|RST | //! | | //! | P3.1|->数据输出(UCB0SIMO) //! | | //! | P3.2|<-数据输入(UCB0SOMI) //! | | //! | P3.3|->串行时钟输出(UCB0CLK) //! //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - SPI 外设 //! - GPIO 端口外设(用于 SPI 引脚) //! - UCB0SIMO //! - UCB0SOMI //! - UCB0CLK //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! - USCI_A0_VECTOR //! // // ////// 指定所需的 SPI 通信频率 // //********* #define SPICLK 500000 uint8_t CommandCode = 0x00; uint8_t DataCode = 0x00; uint8_t 返回值= 0x00; void main (void) { //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //将 P1.1设置为从器件复位 //将 P1.1设置为从器件复位 //将 P1.0设置为输出方向 GPIO_setAsOutputPin ( GPIO_PORT_P1、 GPIO_PIN2 ); //P3.5、4、0选项选择 GPIO_setPeripheralModuleFunctionOutputPin ( GPIO_PORT_P3、 GPIO_PIN0+GPIO_PIN2 ); //初始化主设备 USCI_B_SPI_initMasterParam param ={0}; param.selectClockSource = USCI_B_SPI_CLOCKSOURCE_SMCLK; param.clockSourceFrequency = UCS_getSMCLK(); param.desiredSpiClock = SPICLK; param.msbFirst = USCI_B_SPI_MSB_FIRST; param.clockPhase = USCI_B_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next; param.clockPolarity = USCI_B_SPI_CLOCKPOLARITY_INACTION_HIGH; 返回值= USCI_B_SPI_initMaster (USCI_B0_BASE、param); 如果(STATUS_FAIL =返回值){ 返回; } //启用 SPI 模块 GPIO_setOutputHighOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); USCI_B_SPI_ENABLE (USCI_B0_BASE); //启用接收中断 //等待从器件初始化 _DELAY_CYCLES (100); while (1) { CommandCode = 0x11; DataCode=0x0A; //USCI_A0 TX 缓冲器准备好了吗? //向从器件发送数据 GPIO_setOutputLowOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); USCI_B_SPI_transmitData (USCI_B0_BASE、CommandCode); USCI_B_SPI_transmitData (USCI_B0_BASE、DataCode); GPIO_setOutputHighOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); _DELAY_CYCLES (1000); CommandCode = 0x20; GPIO_setOutputLowOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); USCI_B_SPI_transmitData (USCI_B0_BASE、CommandCode); GPIO_setOutputHighOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); __DELAY_CYCLES (1000); } //初始化数据值 //CPU 关闭、启用中断 _bis_SR_register (LPM0_Bits + GIE); } //********* // ////这是 USCI_B0中断矢量处理例程。 //// *********