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/MSP430FR5994:MSP430FR5994 + DS1620集成

Guru**** 2582405 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/610933/ccs-msp430fr5994-msp430fr5994-ds1620-integration

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

你(们)好

我尝试将 DS1620+温度传感器集成到我的 MSP430FR5994 Launchpad 中、但我遇到了一些问题。 我一直在使用  msp430fr599x_euscia0_spi_09.c 示例文件并对其进行一些修改、Launchpad 仅允许您使用 UCB1端口、因此我将使用这些端口。  

/*-版权所有-、BSD_EX
*版权所有(c) 2015、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*
***
*
* MSP430代码示例免责声明
*
* MSP430代码示例是自包含的低级程序
,通常*以
高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
值*寄存器值和时钟配置等设置、
并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
*。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
*了解外设配置的 API 函数库方法。
*
*--/版权--*
//*********
// MSP430FR5x9x 演示- eUSCI_A0、SPI 3线主器件递增数据
//
//说明:SPI 主器件使用3线模式与 SPI 从器件通信。 递增
//数据由从0x01开始的主器件发送。 接收到的数据应该
//与之前的传输一样 TXData = RXData-1。
// USCI RX ISR 用于处理与 CPU 的通信、通常在 LPM0中。
// ACLK = 32.768kHz、MCLK = SMCLK = DCO ~1MHz。 BRCLK = ACLK/2
//
//
////// MSP430FR5994
// --------
// /|\| XIN|-
// || | 32KHz 晶振
// ---|RST XOUT|-
// | |
// | P5.0|->数据输出(UCB1SIMO)
// | |
// | P5.1|<-数据输入(UCB1SOMI)
// | |
// | P5.2|->SPI CLK (UCB1CLK)
//
William Goh
// Texas Instruments Inc.
// 2015年10月
//使用 IAR 嵌入式工作平台 V6.30和 Code Composer Studio V6.1构建
//*********

#include "driverlib.h"
#include 

#define READ_Temp 0xAA; //读取温度地址
#define READ_Count 0xA0; //计数器字节地址
#define READ_Slope 0xA9; //斜率地址
#define START_Temp_Conv 0xEE; //开始温度转换
#define STOP_Temp_Conv 0x22; //停止温度转换

unsigned char RXData;
unsigned char TXData = 0xAA;

unsigned char data = 0x00;


void test (uint8_t data);

void main (void)
{

WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器

//配置 GPIO
P5SEL0 &=~BIT2; // USCI_A0 SCLK 引脚
P5SEL1 |= BIT2;
P5SEL0 &=~(BIT0 | BIT1); // USCI_A0 MOSI 和 MISO 引脚
P5SEL1 |= BIT0 | BIT1;
PJSEL0 |= BIT4 | BIT5; //表示 XT1


//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

// XT1设置
CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//设置所有分频器
CSCTL4 &=~LFXTOFF;
操作
{
CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1和 OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器

//为 SPI 操作配置 USCI_A0
UCB1CTLW0 = UCSWRST; //**将状态机置于重置中**
UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚、8位 SPI 主器件
//时钟极性高,MSB
UCB1CTLW0 |= UCSSEL_ACLK; // ACLK
UCB1BRW = 0x02; ///2
UCB1CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**


测试(数据);

}

void test (uint8_t data){


while (!(UCB1IFG & UCTXIFG));
UCB1TXBUF = TXData;

while (!(UCB1IFG & UCRXIFG));
数据= UCB1RXBUF;

//data++;
}


顶部的定义是温度传感器的命令、但现在、我只是在尝试从传感器读取之前尝试通过 TX 和 RX 发送和接收一些数据。

如果有任何帮助,将不胜感激。

谢谢

Vivek  

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

    您好、Vivek、

    您能否详细说明您遇到的问题? 我看不到您的代码有什么问题、但您使用 LFXT/2作为 SPI 时钟有点奇怪。 这将是32768Hz/2 = 16384Hz、这对于 SPI 通信而言相对较慢。

    您是否使用逻辑分析仪或示波器查看了总线、以查看数据是否正在发送/接收? 另请查看 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案的 SPI 部分

    此致、  
    Caleb Overbay

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

    你好

    感谢您的回复、这是我当前的代码:

    /*-版权所有-、BSD_EX
    *版权所有(c) 2015、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR5x9x 演示- eUSCI_A0、SPI 3线主器件递增数据
    //
    //说明:SPI 主器件使用3线模式与 SPI 从器件通信。 递增
    //数据由从0x01开始的主器件发送。 接收到的数据应该
    //与之前的传输一样 TXData = RXData-1。
    // USCI RX ISR 用于处理与 CPU 的通信、通常在 LPM0中。
    // ACLK = 32.768kHz、MCLK = SMCLK = DCO ~1MHz。 BRCLK = ACLK/2
    //
    //
    ////// MSP430FR5994
    // --------
    // /|\| XIN|-
    // || | 32KHz 晶振
    // ---|RST XOUT|-
    // | |
    // | P5.0|->数据输出(UCB1SIMO)
    // | |
    // | P5.1|<-数据输入(UCB1SOMI)
    // | |
    // | P5.2|->SPI CLK (UCB1CLK)
    //
    William Goh
    // Texas Instruments Inc.
    // 2015年10月
    //使用 IAR 嵌入式工作平台 V6.30和 Code Composer Studio V6.1构建
    //*********
    
    #include "driverlib.h"
    #include 
    
    #define READ_Temp 0xAA; //读取温度地址
    #define READ_Count 0xA0; //计数器字节地址
    #define READ_Slope 0xA9; //斜率地址
    #define START_Temp_Conv 0xEE; //开始温度转换
    #define STOP_Temp_Conv 0x22; //停止温度转换
    
    //unsigned char RXData;
    //unsigned char TXData = 0xAA;
    
    unsigned char temp;
    
    
    void reset_start (void);
    void reset_stop (void);
    
    void read_TEMP (uint8_t temp);
    
    void main (void)
    {
    
    WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
    
    //配置 GPIO
    P5SEL0 &=~BIT2; // USCI_A0 SCLK 引脚
    P5SEL1 |= BIT2;
    P5SEL0 &=~(BIT0 | BIT1); // USCI_A0 MOSI 和 MISO 引脚
    P5SEL1 |= BIT0 | BIT1;
    PJSEL0 |= BIT4 | BIT5; //表示 XT1
    
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    // XT1设置
    CSCTL0_H = CSKKEY_H; //解锁 CS 寄存器
    CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
    CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
    CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//设置所有分频器
    CSCTL4 &=~LFXTOFF;
    操作
    {
    CSCTL5 &=~LFXTOFFG; //清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0; //锁定 CS 寄存器
    
    //为 SPI 操作配置 USCI_A0
    UCB1CTLW0 = UCSWRST; //**将状态机置于重置中**
    UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚、8位 SPI 主器件
    //时钟极性高,MSB
    UCB1CTLW0 |= UCSSEL_ACLK; // ACLK
    //UCB1BRW = 0x02; ///2
    UCB1CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
    
    Read_TEMP (temp);
    
    }
    
    
    void read_TEMP (uint8_t temp){
    RESET_START();
    
    START_Temp_Conv;
    
    while (!(UCB1IFG & UCTXIFG));
    UCB1TXBUF = Read_Temp;
    
    while (!(UCB1IFG & UCRXIFG));
    TEMP= UCB1RXBUF;
    
    STOP_Temp_Conv;
    
    reset_stop();
    }
    
    
    void reset_start (void){
    GPIO_setOutputLowOnPin (GPIO_PORT_P5、GPIO_PIN0);
    GPIO_setOutputHighOnPin (GPIO_PORT_P5、GPIO_PIN2);
    GPIO_setOutputHighOnPin (GPIO_PORT_P5、GPIO_PIN0);
    }
    
    
    void reset_stop (void){
    GPIO_setOutputLowOnPin (GPIO_PORT_P5、GPIO_PIN0);
    } 

    对于时钟、这就是他们在示例中使用的内容、所以我将其保留为这样! 只是想知道我的 void Read_TEMP 函数是否正确、假设与温度传感器通信相关的所有代码都正确、其余代码是否正确、尤其是 TX 和 RX 线? READ_Temp 命令从传感器读取温度、那么我只传输该值吗?

    谢谢

    Vivek

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

    您好、Vivek、

    我无法评论您对 DS1620的指令是否正确、因为我只是 MSP430的专家。 但是、从您的 Read_TEMP 函数的初始看、我有点困惑。 您已分别为0xEE 和0x22的 START_Temp_Conv 和 STOP_Temp_Conv 定义了值、这意味着您的 READ_TEMP 函数有效:

    void read_TEMP (uint8_t temp){
    RESET_START();
    
    0xEE;
    
    while (!(UCB1IFG & UCTXIFG));
    UCB1TXBUF = Read_Temp;
    
    while (!(UCB1IFG & UCRXIFG));
    TEMP= UCB1RXBUF;
    
    0x22;
    
    RESET_STOP();
    } 

    这毫无意义。 您是否正在尝试将 START_Temp_Conv 和 STOP_Temp_Conv 发送到 DS1620? 如果是、这不会将这些值发送到该部件。 您需要将它们放置在 UCB1TXBUF 中。 此外、当您将 Read_Temp 发送到 DS1620时、您从器件获得的第一个响应将不会是温度。 您需要向 DS1620发送虚拟字节以检索 温度读数。 我建议仔细研究 SPI 协议以更好地理解它、阅读我之前链接的应用报告、并阅读 DS1620数据表以确保您遵循正确的通信格式。  

    此致、  
    Caleb Overbay

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

    您是否仍然需要有关此问题的帮助?

    此致、
    Caleb Overbay