This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件: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中断矢量处理例程。 //// *********
1) 1)您似乎正在从某个电阻切换到关断模式、在这两者之间等待1ms。 您的眼睛将无法看到1ms 的亮度转换(尽管 LED 可能看起来稍微变暗)。 尝试从1000个周期延长到例如100000个周期(0.1秒)。
2)数据表(DS11195C)第5.3节指出、即使忽略了该字节、仍需要在执行关断命令后发送该字节。
3) 3)对于每个事务、您需要等待最后一个字节被发送、然后才能取消对/CS 的置位。 只需旋转、直到 USCI_B_SPI_isBusy ()返回0。
[编辑:更正了拼写错误。]
您好!
您似乎按照我们的代码示例编写代码。 您能否使用数字示波器捕捉波? 我很容易找到原因。
伊斯天
您好、感谢您的建议。 我刚才听从了您的建议、对我的代码进行了一些更改。 但是,不幸的是,它仍然无法工作。
我想这是否是我的 SPI 设置的问题。 我将引脚3.2连接为 CLK、将3.0连接为 MOSI。
我 使用函数"GPIO_setPeripheralModuleFunctionOutputPin"将引脚3.0和3.2设置为 ModuleFunctionOutputPin。 但示例代码将这些全部设置为输入引脚。
我还不能解决问题。 但我明天会做一个数字示波器、看看我是否能找到一些东西。
哦、以下是我当前的代码。
#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); DataCode=0x0A; CommandCode = 0x11; while (1) { //向从器件发送数据 GPIO_setOutputLowOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); USCI_B_SPI_transmitData (USCI_B0_BASE、CommandCode); while (USCI_B_SPI_isBusy (USCI_B0_BASE)); USCI_B_SPI_transmitData (USCI_B0_BASE、DataCode); while (USCI_B_SPI_isBusy (USCI_B0_BASE)); GPIO_setOutputHighOnPin ( GPIO_PORT_P1、 GPIO_PIN2 ); _DELAY_CYCLES (100000); if (DataCode!=0xFE) { DataCode=DataCode+0x01; } 否则{ DataCode=0x0A; } } //初始化数据值 }
您是否发现了问题?
伊斯天