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.

[参考译文] CCS/MSP430F5529:关于 MSP430 SPI 与电位器的通信

Guru**** 2039500 points
Other Parts Discussed in Thread: MSP430F5529
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/881124/ccs-msp430f5529-about-the-msp430-spi-communication-with-a-potentiometer

器件型号:MSP430F5529

工具/软件: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;
    }
    }
    //初始化数据值
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否发现了问题?

    伊斯天