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:MSP430F5529上BOOSTXL-BATPAKMKII的示例代码

Guru**** 2614265 points
Other Parts Discussed in Thread: MSP430F5529, BOOSTXL-BATPAKMKII, MSP430FR6989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/662003/ccs-msp430f5529-sample-code-for-boostxl-batpakmkii-on-msp430f5529

部件号:MSP430F5529
主题中讨论的其他部件:MSP432P401RBOOSTXL-BATPAKMKIIMSP430FR6989

工具/软件:Code Composer Studio

尊敬的各位,我最近购买了BOOSTXL-BATPAKMKII用于我的启动板项目(MSP430F5529)。 我意识到示例代码仅适用于 MSP-EXP432P401R。 我在过去一周一直在尝试为我的特定启动板查找示例代码,但我找不到任何示例代码。 我知道我可以尝试对自己的代码进行编码,但我认为我现在没有对它们进行编码的技能。 在开发方面确实需要帮助。 如果您有任何可与MSP430F5529和BATPAKMKII配合使用的示例代码,请与我分享。 我尝试浏览MSP432P401R的代码,但我不了解它是否足以移植代码,因此它也适用于MSP430F5529。  

感谢您的任何帮助。 我真的很绝望,因为这是我最后一年的项目。  

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

    您好,

    如您所见,BOOSTXL-BATPAKMKII的示例代码仅提供给MSP432P401R。 您可以在网上找到一些资源,这些资源可以帮助您在MSP430和MSP432之间移植代码,但由于核心架构的差异,它将涉及相当多的工作。 通过查看MSP432平台移植指南(SLAA656)的表5,您可以看到需要解决的所有差异:

    在可能的情况下利用Driverlib API将使该过程更加轻松。

    此致,

    Matt Calvo

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

    我已经联系了BOOSTXL-BATPAKMKII的SW团队,并且在TI资源管理器( dev.ti.com/.../ )上发布了MSP430FR6989的示例代码。

    此示例将使您能够更好地开始将代码移植到您希望与Booster-Pack连接的任何MSP430器件。 另一种选择是购买MSP430FR6989 Launchpad,以便立即开始使用Booster Pack,而无需移植任何代码。 希望这有助于您推进项目!

    如果对此线程的支持已完成,请继续并选择"已解决",以便我们可以关闭此线程。

    谢谢,此致,

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

    您好,感谢您的帮助,我非常感谢您的帮助。 MSP430FR6989的示例是更接近的MSP430F5529。 但是,我知道在MSP430FR6989的示例代码中,它使用的是EUSCI,而在MSP430F5529中,它只使用USCI。 我做了一些研究,发现EUSCI和USCI之间没有太大的区别,即使语法几乎相同。 因此,为了移植代码以适应MSP430F5529,我基本上将所有EUSCI功能更改为USCI,更改端口和引脚分配以适应目标板上的那个,并重新编程 特定于MSP430F5529的时钟源。 UART工作正常,但是代码的I2C段工作不好。  

    我需要它运行的频率是:400kHz

    我把它放在示波器上,发现从属设备没有任何确认,但我可以观察到I2C信号发出

    我将其缩小至几个原因

    1.将ESCI转换为USCI I2C时,I可能错误地初始化了I2C。

    2.我的时钟初始化也可能出错。  

    很抱歉在这方面给您带来麻烦,因为我对微控制器非常熟悉,我需要您的帮助来为我查看代码,看看您是否可以发现任何错误。  

    时钟初始化:

    //#include <stdbool.h>
    #include <driverlib.h>
    #include "myClocks.h"
    
    
    //***** 定义***********************************************************************
    #define lf_crystal_frequency_in_Hz 3.2768万 // 32KHz
    #define hf_crystal_frequency_in_Hz 400万 // 4MHz
    
    #define MCLK_Desired频率_in_kHz 8000 // 8MHz
    #define MCLK_FLLREF_Ratio MCLK_Desired频率_in_kHz /(UCS_REFOCLK_FREQUENCY / 1024)//比率= 250
    
    
    //***** 全局变量******************************************************
    uINT32_t myACLK = 0;
    uINT32_t mySMCLK = 0;
    uINT32_t myMCLK = 0;
    
    
    //***** 初始化锁定******************************************************************************
    void initClocks(void){
    
    //******************************************************************************************************************
    //配置核心电压电平
    //******************************************************************************************************************
    //设置核心电压级别以处理8MHz时钟频率
    PMM_setVCore( PMM_Core_LEVEL_1 );
    
    
    //******************************************************************************************************************
    //配置振荡器
    //******************************************************************************************************************
    //设置LaunchPad上使用的XT1/XT2晶体频率,并将
    	//连接到时钟引脚,以便driverlib知道它们的速度(这些是
    //需要用于DriverLib时钟'Get'和晶体启动功能)
    UCS_setExternalClockSource(.
    lf_crystal_frequency_in_Hz, // XT1CLK输入
    hf_crystal_frequency_in_Hz // XT2CLK输入
    );
    
    //验证默认时钟设置是否符合预期
    myACLK = UCS_getACLK();
    mySMCLK = UCS_getSMCLK();
    myMCLK = UCS_getMCLK();
    
    
    
    //******************************************************************************************************************
    //配置时钟
    //******************************************************************************************************************
    //将ACLK设置为使用REFO作为其振荡器源(32KHz)
    UCS_initClockSignal(.
    UCS_ACLK, //正在配置时钟
    UCS_REFOCLK_SELECT, //时钟源
    UCS_CLOCK分隔符_1 //将时钟源除以此数字
    );
    
    //将REFO设置为FLL的振荡器参考时钟
    UCS_initClockSignal(.
    UCS_FLLREF, //正在配置时钟
    UCS_REFOCLK_SELECT, //时钟源
    UCS_CLOCK分隔符_1 //将时钟源除以此数字
    );
    
    //将MCLK和SMCLK设置为使用DCO/FLL作为其振荡器源(8MHz)
    	//函数执行许多操作:计算所需的FLL设置;配置FLL和DCO
    	,//然后将MCLK和SMCLK设置为使用DCO (具有FLL运行时校准)
    UCS_INITFLLSettle(.
    MCLK_Desired频率_in_kHz, // MCLK频率
    MCLK_FLLREF_Ratio // MCLK和FLL的参考时钟源之间的比率
    );
    
    ////可选实验步骤将MCLK设置为从REFO运行
    ////这将使LED在我们的while中闪烁非常慢{}循环
    // UCS_initClockSignal( UCS_Base,
    // UCS_MCLK, //您正在配置的时钟
    // UCS_REFOCLK_SELECT, //时钟源
    // UCS_CLOCK分隔符_1 //将时钟源除以此数
    //);
    
    //验证修改后的时钟设置是否符合预期
    myACLK = UCS_getACLK();
    mySMCLK = UCS_getSMCLK();
    myMCLK = UCS_getMCLK();
    } 



    I2C初始化

    #include <driverlib.h>
    #include "HAL_I2C.h" 

    #定义I2C_BASE USI_B1_BASE
    
    #define I2C_SCL_port GPIO端口P4
    #define I2C_SCL_PIN GPIO _PIN2
    
    #define I2C_SDA_PORT GPIO端口P4
    #define I2C_SDA_PIN GPIO_PIN1 

    #include <driverlib.h>
    #include "HAL_I2C.h"
    
    
    //* I2C主配置参数*//USI_B_I2C_initMasterParam
    i2cParam =//{/
    
    USI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
    //		800万, // SMCLK = 8MHz
    // USI_B_I2C_SET_DATA_RATE_400KBPS, //所需的I2C时钟为400kHz
    // 0 //无字节计数器阈值
    // //*USI_B_I2C_NO_AUTO_STOP //无自动停止
    //};
    
    
    无效I2C_initGPIO ()
    {
    /*为I2C_SCL和I2C_SDA */选择I2C功能
    GPIO_setAsPeripheralModuleFunctionOutputPin (
    		I2C_SCL_PORT,
    			I2C_SCL_PIN);
    
    GPIO_setAsPeripheralModuleFunctionOutputPin (
    		I2C_SDA_PORT,
    			I2C_SDA_PIN);
    //P4SEL |= BIT1 + BIT2;
    }/***********************************************************************************
    
    
    //**
    *@brief configures I2C
    *@param none
    *@return none
    ************************************************************************************************ /
    
    void I2C_init (void)
    {
    USI_B_I2C_initMasterParam ={0};
    param.selectClockSource = USI_B_I2C_CLOCKSOURCE_SMCLK;
    PARAM.i2cClk = UCS_getSMCLK();
    Param.datarate = USI_B_I2C_SET_DATA_RATE_400KBPS;
    /*初始化USI_B0和I2C主设备以与从属设备进行通信*/
    //USI_B_I2C_INITMaster (I2C_BASE,&i2cParam);
    USI_B_I2C_initMaster (I2C_BASE,&param);
    
    /*禁用I2C模块以进行更改*/
    USI_B_I2C_DISABLE (I2C_BASE);
    
    /*启用I2C模块以启动操作*/
    USI_B_I2C_ENABLE (I2C_BASE);
    
    返回;
    }/***************************************************************************
    
    
    //**
    *@brief会将数据写入传感器
    *@param pointer您要修改的寄存器地址
    *@param writeByte Data to be written to the specified register
    *@return none
    ********************************************************************** /
    
    bool I2C_write8 (无符号字符指针,无符号字符写入字节,无符号int超时)
    {
    /*将主设备设置为传输模式PL */
    	USI_B_I2C_setMode (I2C_BASE,
    USI_B_I2C_Transmit_mode);
    
    /*清除任何现有中断标志PL */
    	USI_B_I2C_clearInterrupt (I2C_BASE,
    USI_B_I2C_Transmit_Interrupt);
    
    /*启动开始并发送第一个字符*/
    如果(!USI_B_I2C_masterSendMultiByteStartWithTimeout (I2C_BASE,
    指针,超时))
    	返回0;
    
    如果(!USI_B_I2C_masterSendMultiByteFinishWithTimeout(I2C_base,
    writeByte,超时))
    	返回0;
    
    返回1;
    }/***************************************************************************
    
    
    //**
    @brief将数据写入传感器
    *@param Pointer您要修改的寄存器地址
    *@param writeWord数据将写入指定寄存器
    *@Return none
    ********************************************************************** /
    
    bool I2C_write16 (无符号char指针,无符号短写Word,无符号int超时)
    {
    /*将主设备设置为传输模式PL */
    	USI_B_I2C_setMode (I2C_BASE,
    USI_B_I2C_Transmit_mode);
    
    /*清除任何现有中断标志PL */
    	USI_B_I2C_clearInterrupt (I2C_BASE,
    USI_B_I2C_Transmit_Interrupt);
    
    /*启动开始并发送第一个字符*/
    如果(!USI_B_I2C_masterSendMultiByteStartWithTimeout (I2C_BASE,
    指针,超时))
    	返回0;
    
    /*将写字节的MSB发送到传感器*/
    如果(!USI_B_I2C_masterSendMultiByteNextWithTimeout(I2C_base,
    (unsigned char)(writeWord&0xFF),超时)
    	返回0;
    
    如果(!USI_B_I2C_masterSendMultiByteFinishWithTimeout(I2C_base,
    (unsigned char)(writeWord>>8),超时)
    	返回0;
    
    返回1;
    }/***************************************************************************
    
    
    //**
    @简要读取传感器的数据
    *@参数指针要读取的寄存器地址
    *@返回寄存器内容
    ******************************************************************************** /
    
    bool I2C_read8 (无符号char指针,char *结果,无符号int超时)
    {
    	volatile int val =0;
    	volatile int valScratch =0;
    
    /*将主设备设置为传输模式PL */
    	USI_B_I2C_setMode (I2C_BASE,
    USI_B_I2C_Transmit_mode);
    
    /*清除任何现有中断标志PL */
    	USI_B_I2C_clearInterrupt (I2C_BASE,
    USI_B_I2C_Transmit_Interrupt);
    
    /*启动开始并发送第一个字符*/
    如果(!USI_B_I2C_masterSendSingleByteWithTimeout(I2C_base,
    指针,超时))
    	返回0;
    
    /*
    *生成启动条件并将其设置为接收模式。
    *这将发送从属地址并继续读取
    *直到您发出停止
    */
    // I2C_masterReceiveStart (I2C_BASE);
    //
    ///*从I2C RX寄存器读取*//
    if (!I2C_masterReceiveMultiByteFinishWithTimeout (I2C_BASE,&val,timeout))
    //	返回0;
    //
    ////返回温度值*///*结果
    = val;
    
    *result = USI_B_I2C_masterReceiveSingle (I2C_base);
    
    返回1;
    }/***************************************************************************
    
    
    //**
    @简要读取传感器的数据
    *@参数指针要读取的寄存器地址
    *@返回寄存器内容
    ******************************************************************************** /
    
    bool I2C_read16 (无符号字符指针,短*结果,无符号int超时)
    {
    UINT8_t val = 0;
    UINT8_t valScratch = 0;
    短r = 0;
    
    /*将主中继器设置为传输模式PL */
    USI_B_I2C_setMode (I2C_BASE,
    USI_B_I2C_Transmit_mode);
    
    /*清除任何现有中断标志PL */
    USI_B_I2C_clearInterrupt (I2C_BASE,
    USI_B_I2C_Transmit_Interrupt);
    
    /*启动开始并发送第一个字符*/
    如果(!USI_B_I2C_masterSendSingleByteWithTimeout(I2C_base, pointer, timeout))
    	返回0;
    
    /*
    *生成启动条件并将其设置为接收模式。
    *这将发送从属地址并继续读取
    *直到您发出停止
    */
    USI_B_I2C_masterReceiveSingleStart (I2C_BASE);
    
    /*等待RX缓冲区填满*/
    while (!(USI_B_I2C_getInterruptStatus (I2C_BASE,
    USI_B_I2C_Receive_interrupt)));
    
    /*从I2C RX寄存器读取*/
    valScratch = USI_B_I2C_masterReceiveMultiByteNext(I2C_base);
    
    /*接收第二个字节,然后发送停止条件*/
    IF (!USI_B_I2C_masterReceiveMultiByteFinishWithTimeout (I2C_BASE,&val,timeout))
    	返回0;
    
    /*移动val到顶部MSB */
    r =(val <8);
    
    /*从I2C RX寄存器读取并写入r */的LSB
    r |= ValScatch;
    
    /*返回温度值*/
    *结果= r;
    
    返回1;
    }
    
    
    void I2C_setslaver(unsigned short slaveAdr){
    
    /*指定I2C */
    	USI_B_I2C_setSlaveAddress (I2C_BASE,
    SlaveAdr);
    
    /*启用和清除中断标志*/
    	USI_B_I2C_clearInterrupt (I2C_BASE,
    USI_B_I2C_Transmit_Interrupt + USI_B_I2C_Receive_interrupt);
    返回;
    } 

    在程序中,典型的I2C读取将调用以下函数

     
    bool BQ2.7441万_read16 (短stdcommand,短*result,无符号int超时)
    {
    	I2C_init();
    
    	/*指定BQ2.7441万的从属地址*/
    	I2C_setslaver(BQ2.7441万_slaver_address);
    
    	if (!I2C_read16(stdcommand, result, timeout))
    		返回0;
    
    	返回1;
    } 

    
    

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

    我很高兴看到您在将代码从FR6989移植到F5529方面取得了进展。 最好是按步骤操作,并确保每个已转换的模块都能正常工作,然后再继续下一个模块,这似乎是您成功完成的。 听起来,I2C主控制器和从属控制器之间可能存在某种通信不匹配。

    由于您有一个工作示例代码经过测试,可以在MSP430FR6989 Launchpad上成功运行,因此,在对MSP430F5529 I2C和时钟初始化和实施进行编码时,确保将其用作指导符合您的最佳利益。 一个可以帮助您确定可能存在的错误的资源是应用程序报告,它侧重于常见eUSCI和USCI串行解决方案
    MSP430TmMCU ( www.ti.com/.../slaa734.pdf )上的通信问题。

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

    请告知我们此线程是否有任何更新。 如果支持已完成,请继续并选择"已解决",以便我们可以关闭此线程并将其记录。 感谢您的帮助!

    此致,

    Matt Calvo