打印
[N32G43x]

N32G435单片机读取异常

[复制链接]
69|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XXXVip|  楼主 | 2025-2-25 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬帮忙看看是啥问题。
原本SPI寄存器中的数据长度设置的16位,读取从机寄存器8位数据没有问题。因为要读取从机寄存器的24位数据,故将数据长度设置为8位,但读取的8位数据都变成了0或者FF,示波器抓取了MISO上的波形与应该读取到的数值一样,但从SPI数据寄存器中读的值就不对。
原本数据长度设置为16位时的发送函数:
/*********************************************
函数: void SPI_WriteByte(uint16_t data)
描述: SPI写数据.
参数: none
返回: none
版本: V1.0, 2025-1-8
**********************************************/
void SPI_WriteByte(uint16_t data)
{
     /* Wait for SPI1 Tx buffer empty */
     while (SPI_I2S_GetStatus(SPI1, SPI_I2S_TE_FLAG) == RESET)
         ;
   
     /* Check the parameters */
    assert_param(IS_SPI_PERIPH(SPI1));

    /* Write in the DAT register the data to be sent */
    SPI1->DAT = data;
   
    /* 等待发送完成 */
     while (SPI_I2S_GetStatus(SPI1, SPI_I2S_BUSY_FLAG) == SET)
         ;
}

设置为8位的发送函数:
/*********************************************
函数: void SPI_WriteByte(uint16_t data)
描述: SPI写数据.
参数: none
返回: none
版本: V1.0, 2025-1-8
**********************************************/
void SPI_WriteByte(uint16_t data)
{
    uint8_t byte1,byte2;
    byte1 = (data >> 8) & 0xFF;
    byte2 = data & 0xFF;
     /* Wait for SPI1 Tx buffer empty */
     while (SPI_I2S_GetStatus(SPI1, SPI_I2S_TE_FLAG) == RESET)
         ;
   
     /* Check the parameters */
    assert_param(IS_SPI_PERIPH(SPI1));

    /* Write in the DAT register the data to be sent */
    SPI1->DAT = byte1;
     
     while (SPI_I2S_GetStatus(SPI1, SPI_I2S_TE_FLAG) == RESET)
         ;
     /* Check the parameters */
    assert_param(IS_SPI_PERIPH(SPI1));
     
     SPI1->DAT = byte2;
   
    /* 等待发送完成 */
     while (SPI_I2S_GetStatus(SPI1, SPI_I2S_BUSY_FLAG) == SET)
         ;
}

SPI读函数用的是官方例程中的,数据8位或16位都用的这个:
/*********************************************
函数: uint8_t SPI_ReadByte(uint8_t addr)
描述: SPI读寄存器数据.
参数: none
返回: none
版本: V1.0, 2025-1-8
**********************************************/
uint8_t SPI_ReadByte(void)
{
    while (SPI_I2S_GetStatus(SPI1, SPI_I2S_RNE_FLAG) == RESET)
         ;
    /* Check the parameters */
    assert_param(IS_SPI_PERIPH(SPI1));

    /* Return the data in the DAT register */
    return SPI1->DAT;
}

从机数据读取函数:
/*********************************************
函数: uint8_t  TDC7200_ReadByte(uint8_t addr)
描述: TDC7200读寄存器.
参数: none
返回: none
版本: V1.0, 2025-1-8
**********************************************/
uint8_t  TDC7200_ReadByte(uint8_t addr)
{
    uint8_t Rd_Data;
    uint16_t addr_data;
    SPI_CS_L_TDC7200();
    addr_data = ((0x80 | addr) << 8) | Data_Buf;
    SPI_WriteByte(addr_data);
    Rd_Data = SPI_ReadByte();
    SPI_CS_H_TDC7200();
    return Rd_Data;
   
}

使用特权

评论回复
沙发
XXXVip|  楼主 | 2025-2-25 16:44 | 只看该作者
读从机数据,需要发8位命令和8位的空数据,数据长度设置16位,和数据长度设置8位,发送接收的波形都正常,但设置8位时接收的数据就不对

使用特权

评论回复
板凳
suncat0504| | 2025-2-25 23:08 | 只看该作者
时序上匹配没?可以通过逻辑分析仪的波形改程序,在时序上保持一致就应该没问题。另外一点注意SPI的设置,避免设置错误,导致数据丢失。比如时钟信号的极性、第几个脉冲沿之类的设置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝