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/MSP430I2041:想要将 ds3231与 msp430i2041连接

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/968320/ccs-msp430i2041-want-to-interface-ds3231-with-msp430i2041

器件型号:MSP430I2041

工具/软件:Code Composer Studio

我已经成功地从 ds3231读取数据。但是现在我想在 UART 上发送这个 RTC 数据、但是我的代码卡在这里

//轮询发送中断标志。    

while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG))  

  {     

 ;   

 }

以下是我的代码:

void main (void)


uint8_t i;

uint8_t 校验和;

//T_cycle=4098;//8192;//对于500Hz=8192、对于1kHz =4098
T_cycle=8192;
Duty=0;//初始灯应熄灭

//D_cycle=(uint16_t)(40.98*占空比);
d_cycle=(uint16_t)(81.92*(100占空比));//(100占空比)、因为我们使用了光耦合器
LAMP_ON=0;

Timer_A_outputPWMParam outputPWMConfig ={
Timer_A_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
Timer_A_CLOCKSOURCE_DELAG_4、// SMCLK/4 = 4.096MHz
Timer_period、// 8ms
Timer_A_CAPTURECOMPARE 寄存器_1、// TA0.1上的输出
Timer_A_OUTPUTMODE_RESET_SET、//生成 PWM
Timer_Duty_cycle // 75%占空比
};
Timer_A_initContinuousModeParam continuousModeConfig ={
Timer_A_CLOCKSOURCE_ACLK、// ACLK 时钟源
Timer_A_CLOCKSOURCE_DELUGER_1、// ACLK/1 = 32kHz
Timer_A_TAIE_INTERRUPT_ENABLE、//启用溢出 ISR
Timer_A_DO 清除//清除计数器
};

EUSCI_B_I2C_initMasterParam i2cConfig =

EUSCI_B_I2C_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
4096000、// SMCLK = 4.096MHz
EUSCI_B_I2C_SET_DATA_RATE 400KBPS、//所需的400kHz I2C 时钟
0、//无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};


MSP_GUI_System_setup();

//将 EM Lib 初始化为默认设置并开始转换
EMLibGUIApp_Init();

GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P1、GPIO_PIN5、GPIO_secondary 模块功能);

Timer_A_outputPWM (timer_A0_BASE、&outputPWMConfig、T_cycle、D_cycle);

Timer_A_initContinuousMode (timer_A1_base、连续模式配置);

Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);

WDT_HOLD (WDT_BASE);


CS_setupDCO (CS_internal_voltageR);

//设置 SMCLK = DC0 / 4 = 4.096MHz
CS_initClockSignal (CS_SMCLK、CS_clock_divider 4);

//将 P1.6和 P1.7设置为 I2C 引脚
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6 | GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);

//使用 SMCLK 在400kHz 下设置 I2C 通信
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、&i2cConfig);

//设置从机地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);

//启用模块以进行操作
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);

//__delay_cycles (50);
_DELAY_CYCLES (10000000);
//启用所需的 I2C 中断
EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT);
EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT);

EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT);
EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT);

_DELAY_CYCLES (10000000);
// WriteRTCByte (0x68、0x00、0x00、0x00、0x09、0x03、0x1E、0x0C、0x14);
// WriteRTCByte (0x68、0x00、0x00);
sec1=0;
sec1=ReadRTCByte (0x68、0x01);

//这是设计中心主循环

while (1){
//sec1=ReadRTCByte (0x68、0x00);

EMLibGUIApp_Engine();

EUSCI_A_UART_transmitData (0x0140、sec1);

空 WriteRTCByte (uint8_t i2cADD、uint8_t rtcADD、uint8_t DATA)

EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、i2cADD);
//设置发送模式
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
_DELAY_CYCLES (50);
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、rtcADD);
EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、DATA);
EUSCI_B_I2C_masterSendMultiByteStop (EUSCI_B0_BASE);
while (EUSCI_B_I2C_isBusy (EUSCI_B0_BASE));
}//end void WriteRTCByte (uint8_t i2cAdd、uint8_t rtcAdd、uint8_t data)


uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)

uint8_t i2cByte;

//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、i2cADD);
//设置发送模式
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
_DELAY_CYCLES (50);
EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、rtcADD);
while (EUSCI_B_I2C_isBusy (EUSCI_B0_BASE));

//指定从器件地址
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、i2cADD);
//设置接收模式
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE);
i2cByte = EUSCI_B_I2C_masterReceiveSingle (EUSCI_B0_BASE);
EUSCI_B_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE);
_DELAY_CYCLES (50);
while (EUSCI_B_I2C_isBusy (EUSCI_B0_BASE));
return (i2cByte);
}//end uint8_t ReadRTCB

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

    您好、 Ashwini、

    感谢您的发帖、欢迎使用 E2E! 在发布代码时、如果您使用语法 Highlighter 插入代码、则更易于阅读。

    [引用 user="Ashwini Jadhav"]我已成功从 ds3231读取数据。但现在我想在 UART 上发送此 RTC 数据,但我的代码卡在此处

    /轮询发送中断标志。
    
    while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG)
    
    ){
    
    ;
    
    } 

    什么文件包含此代码? 我怀疑它位于与 I2C 相关的文件中、这表明 I2C 通信而不是 UART 通信存在问题。

    您还会将代码添加到由 EMDC 生成的代码中、这很好。 但是、我会注意一次添加太多内容。 在将 I2C 通信添加到 EMDC 项目之前、最好使其正常工作、以便调试。

    此致、

    James

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

    您好、先生、

    是的、它是与 I2C 相关的代码。

    我调试代码、每当我注释/禁用此函数时、我都会发现这一点

    void EMLibGUIApp_Init (void)
    {
    EM_MESSAGE_CODE 代码;
    
    //初始化电能测量库
    Code = EM_configureEnergyMeasurement (&gEmSWConfig、(EM_SW_Lib_Result_Handle *)&gEmSWResult);
    
    if (代码!= EM_MESSAGE_CODE_NO_ERROR)
    {
    //发生错误
    while (1);
    }
    
    //初始化运行时校准值
    em_initalizeCalibrationValues ((uint8_t*) g_emPhaseCalibration、
    (uint8_t*) g_savedEmPhaseCalibration);
    
    //初始化直流滤波器
    EM_initDCFilters (&gEmSWConfig、(EM_SW_Lib_Result_Handle *)&gEmSWResult);
    
    // HAL_ADC_init
    HAL_ADC_init (halAdcConfig);
    
    //对于1.2V 基准电压稳定、延迟~200us
    _delay_cycles (3200);
    
    //开始转换
    HAL_ADC_startConversion (halAdcConfig);
    
    /*打开全局中断*/
    __ENABLE_INTERRUPT();
    } 

    然后、代码对 RTC 正常工作、并且它在 UART 上持续发送 RTC 数据。但是如果我启用此功能、则不与 RTC 通信

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

    您好!

    您正在取得良好的进展。 当您注释掉这部分代码(特别是最后一行代码)时、您将禁用全局中断。 因此、您的代码可能正常工作、因为您正在启动 I2C 通信并使用轮询、而在 UART 侧、您只需要发送不需要 ISR 的数据。

    当您启用此函数并因此启用全局中断时、会开始执行其他操作、例如捕获、计算计量数据并将其发送到主机的 SD ADC 和 UART TX ISR。 如果您使用轮询与中断、可能会遇到时序问题或与 EMDC 代码发生冲突。

    回到您的初始帖子、我不知道为什么代码在那里结束、看起来您只是设置了 I2C、但没有传输任何内容。 这些 I2C 命令似乎已注释掉、但其中一个或多个命令可能未注释。

    此致、

    James