关于HC32L136k8硬件SPI调试

博主在调试HC32L136K8单片机通过硬件SPI与RC520芯片通信时遇到问题,软件SPI正常但硬件SPI出现读取错误。通过实验发现,读取RC520数据时必须加入适当延时,并且在写数据后也需要读取一次以确保通信完整。提供的成功代码示例中展示了读写RC520寄存器的步骤,强调了数据读出的重要性。
摘要由CSDN通过智能技术生成

关于HC32L136k8硬件SPI与RC520调试

调试环境说明

1、使用keil5 优化级别最低
2、MCU HC32L136K8TA
3、SDK版本 hc32l13x_ddl_Rev1.9.2 Lite
4、调试器 jlink
5、开发板HC32Lx3x-stk-v2.0
6、芯片配置:32M外部晶振 HCLK32M PCLK32M ,SPI的CLK是PCLK/4 ,SPI配置 时钟相位0 极性0

问题

我用了HC32L136开发板调试RC522芯片,使用软件SPI可以的,一旦使用硬件SPI就莫名的出错,可以说读不出来,调试了好久,好累啊,希望各位使用此单片机硬件SPI避免坑,本人才疏学浅,有些不详细或出错描述,请见谅,欢迎指正,拒绝差评哦

样列代码分析(这段可以不看哦)

这处的代码是 实例 SPI MASTER

   ///< 片选,开始通讯
    Spi_SetCS(M0P_SPI0, FALSE);
    ///< 主机向从机发送数据
    while(tx_cnt<10)                                        //主机发送数据给从机
    {
        while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE);    //等待发送缓冲器空
        Spi_SendData(M0P_SPI0, tx_buf[tx_cnt++]);
    }

    ///< 主机接收从机数据
    while(rx_cnt<10)                                        //接收从机的数据
    {
        while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE);    //等待发送缓冲器空
        Spi_SendData(M0P_SPI0, 0);                          //发送空数据
        delay10us(20);
        while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
        rx_buf[rx_cnt++] = Spi_ReceiveData(M0P_SPI0);
    }

    ///< 结束通信
    Spi_SetCS(M0P_SPI0, TRUE);

他所给的代码是两个单片机互相SPI通信 一个为master,一个为slave。我没有实测。
1、可以得出关键点接收数据必须延时,实测延时delay10us(1);可以,不过偶尔不行,我设的delay10us(2);
2、以下分析RC520通信SPI
2.1得到RC520寄存器数据步骤:
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 地址);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 0); //发送空数据
delay10us(20);
while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
数据 = Spi_ReceiveData(M0P_SPI0);
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);
2.2写数据到RC520寄存器
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 地址);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE); //等待发送缓冲器空
Spi_SendData(M0P_SPI0, 数据); //
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);

实验成功的代码----读数据到RC520

	uint8_t ucResult=0,temp;
	uint8_t ucAddr;
	///< 片选,开始通讯
	Spi_SetCS(M0P_SPI0, FALSE);
	ucAddr = ((ucRegAddr<<1)&0x7E)|0x80;
	//发送地址
	while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE){};    //等待发送缓冲器空
    Spi_SendData(M0P_SPI0, ucAddr);
    while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);			
	temp =  Spi_ReceiveData(M0P_SPI0);
	temp = temp +1;
    while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE);    //等待发送缓冲器空
    Spi_SendData(M0P_SPI0, 0x00);                          //发送空数据
    delay10us(2);
    while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
    ucResult = Spi_ReceiveData(M0P_SPI0);
	///< 结束通信
	Spi_SetCS(M0P_SPI0, TRUE);

实验成功的代码----写数据到RC520

uint8_t ucAddr,temp=0;
///< 片选,开始通讯
Spi_SetCS(M0P_SPI0, FALSE);
ucAddr = ((ucRegAddr<<1)&0x7E);
//发送地址
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE){};    //等待发送缓冲器空
Spi_SendData(M0P_SPI0, ucAddr);
delay10us(2);
while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
temp = 	Spi_ReceiveData(M0P_SPI0);
while(Spi_GetStatus(M0P_SPI0, SpiTxe) == FALSE);    //等待发送缓冲器空
Spi_SendData(M0P_SPI0, ucRegVal);                          //
while(Spi_GetStatus(M0P_SPI0, SpiRxne) == FALSE);
temp = 	Spi_ReceiveData(M0P_SPI0);
temp = temp+1;
///< 结束通信
Spi_SetCS(M0P_SPI0, TRUE);

总结

操作时必须把数据读出才行,不可以忽略

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值