单片机/MCU论坛
直播中

李辉

7年用户 1329经验值
私信 关注
[问答]

使用MINI54ZDE发现串口没有输出波形,i2C上有数据,但是mcu接收不到是为什么?

最近接了一个项目,用的是MINI54ZDE,手上并没有实际板子。
使用内部RC作为时钟源,用串口打印I2C收到的数据,并控制相应IO状态.
但是现在发现IO可以正常控制,但是串口和i2c都没有工作。串口没有输出波形,i2C上有数据,但是mcu接收不到,下面是配置代码,请老铁们给看看

系统及外设时钟配置:
void SYS_Init(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    CLK_EnableXtalRC(CLK_PWRCON_HIRC_EN_Msk);

    CLK_WaitClockReady(CLK_CLKSTATUS_IRC22M_STB_Msk);

    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC,CLK_CLKDIV_HCLK(2));

    CLK_SetSystickClockSrc(CLK_CLKSEL0_STCLK_S_HIRC_DIV2);

    CLK_EnableModuleClock(UART_MODULE);
    CLK_EnableModuleClock(I2C_MODULE);

    CLK_SetModuleClock(UART_MODULE,CLK_CLKSEL1_UART_S_HIRC,CLK_CLKDIV_UART(1));

    SYS->P0_MFP  = ~(SYS_MFP_P01_Msk | SYS_MFP_P00_Msk);
    SYS->P0_MFP |= (SYS_MFP_P01_RXD | SYS_MFP_P00_TXD);

    SYS->P3_MFP = SYS_MFP_P34_SDA | SYS_MFP_P35_SCL;

    SYS_LockReg();

    SystemCoreClockUpdate();
}


上电相关配置:
int32_t main (void)
{
    uint32_t i;
    unsigned char debugdata[5];

    /* Init System, IP clock and multi-function I/O */
    SYS_Init();
    GPIO_Init();
               
    /* Init UART to 115200-8n1 for print message */
    UART_Open(UART0, 115200);
        
    /* Init I2C */
    I2C_Init();
    /* I2C enter no address SLV mode */
    I2C_SET_CONTROL_REG(I2C, I2C_SI | I2C_AA);
    ......

回帖(2)

王燕

2024-1-15 16:31:38
串口没有波形,是TX没有波形吗?那样pinview看看TX多功能管脚是否真的切换到UART TX功能了
举报

毛头大小子

2024-1-15 16:53:43
根据你提供的代码片段来看,你在系统初始化中启用了内部高速时钟源(CLK_PWRCON_HIRC_EN_Msk),并等待时钟稳定(CLK_CLKSTATUS_IRC22M_STB_Msk)。但是没有看到你配置串口和I2C相关的时钟和引脚。

首先,你需要根据你的应用要求选择合适的时钟源和分频器来为串口和I2C配置正确的工作时钟。你可以使用CLK_SetModuleClock()函数来设置模块时钟。例如,如果你要使用PCLK1作为串口和I2C的时钟源,可以按照以下方式进行设置:

CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_PCLK1, CLK_CLKDIV_UART(1));
CLK_SetModuleClock(I2C1_MODULE, CLK_CLKSEL1_I2C1SEL_PCLK1, CLK_CLKDIV_I2C(1));

这将将UART0和I2C1的时钟源选择为PCLK1,并将分频器设置为1。

然后,你需要配置正确的引脚配置来使得串口和I2C正常工作。你可以使用SYS->GPB_MFP和SYS->GPC_MFP寄存器来设置引脚映射。例如,如果你要使用PB0和PB1作为UART0的引脚,可以进行如下设置:

SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RX | SYS_GPB_MFP_PB1_UART0_TX);

类似地,你需要设置正确的引脚映射来配置I2C引脚。

最后,你需要使能相应的时钟和模块使得串口和I2C能够正常工作。你可以使用CLK_EnableModuleClock()函数来使能模块时钟。例如,关于UART0和I2C1的使能可以如下设置:

CLK_EnableModuleClock(UART0_MODULE);
CLK_EnableModuleClock(I2C1_MODULE);

请注意,以上代码片段仅供参考,并可能需要根据你的硬件和应用需求进行适当调整。

除了时钟和引脚配置外,还需要确保其他相关的初始化和配置(例如UART和I2C的初始化、中断配置等)正确完成。

如果你确认了以上配置正确无误,但仍然无法正常使用串口和I2C,可能需要进一步检查硬件电路和信号连接,以确定是否存在硬件问题。

另外,如果你手头没有实际的开发板,很难判断是否是硬件问题。建议你尽量获取一个实际板子进行调试和测试,以便更好地分析和解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分