gaojiqiang 发表于 2021-8-18 15:30:12

【SPI】SPI读数据问题,FM33LC0XX,请大神解答一下,谢谢

本帖最后由 gaojiqiang 于 2021-8-19 14:41 编辑

SPI在读取数据时,返回第一字节数据就是有效数据,但从芯片上写的是第二字节回复的才是有效数据。

具体代码如下:
void SpiInit(void)//SPI初始化
{
    FL_GPIO_InitTypeDef gpioInitStruct = {0};
    FL_SPI_InitTypeDef spiInitStruct = {0};

    spiInitStruct.baudRate = FL_SPI_BAUDRATE_DIV256;
    spiInitStruct.bitOrder = FL_SPI_BIT_ORDER_MSB_FIRST;
    spiInitStruct.clockPhase = FL_SPI_PHASE_EDGE1;
    spiInitStruct.clockPolarity = FL_SPI_POLARITY_NORMAL;
    spiInitStruct.dataWidth = FL_SPI_DATA_WIDTH_8B;
    spiInitStruct.mode = FL_SPI_WORK_MODE_MASTER;
    spiInitStruct.softControl = FL_DISABLE;
    spiInitStruct.transferMode = FL_SPI_TRANSFER_MODE_FULL_DUPLEX;
    FL_SPI_Init(SPI1, &spiInitStruct);

    FL_SPI_ClearTXBuff(SPI1);
    FL_SPI_ClearRXBuff(SPI1);

    gpioInitStruct.pin =FL_GPIO_PIN_9 | FL_GPIO_PIN_10 |FL_GPIO_PIN_11;//配置GPIO
    gpioInitStruct.mode = FL_GPIO_MODE_DIGITAL;
    gpioInitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    gpioInitStruct.pull = FL_DISABLE;
    gpioInitStruct.remapPin = FL_DISABLE;
                FL_GPIO_Init(GPIOB, &gpioInitStruct);//初始化GPIOB
               
    gpioInitStruct.pin = FL_GPIO_PIN_8 |FL_GPIO_PIN_3;//配置PSI1片选
    gpioInitStruct.mode = FL_GPIO_MODE_OUTPUT;
    gpioInitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    gpioInitStruct.pull = FL_DISABLE;
    gpioInitStruct.remapPin = FL_DISABLE;

}

void MS520_Write(uint8_t address,uint8_t data )//SPI写地址和数据
{               
                MS520_CS_L;
                FL_DelayUs(20);
                FL_SPI_WriteTXBuff(SPI1, address|0x00);
                while(!(FL_SPI_IsActiveFlag_TXBuffEmpty(SPI1)));
                while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPI1)));
                FL_SPI_ReadRXBuff(SPI1);
                FL_SPI_WriteTXBuff(SPI1, data);
                while(!(FL_SPI_IsActiveFlag_TXBuffEmpty(SPI1)));
                while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPI1)));
                FL_SPI_ReadRXBuff(SPI1);
                FL_DelayUs(20);
                MS520_CS_H;      
}


uint8_t MS520_Read(uint8_t address)//SPI读数据
{               
                uint8_t byet=0;
                MS520_CS_L;
                FL_DelayUs(20);
                FL_SPI_WriteTXBuff(SPI1, address|0x80);//发送读地址
                while(!(FL_SPI_IsActiveFlag_TXBuffEmpty(SPI1)));
                while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPI1)));
                FL_SPI_ReadRXBuff(SPI1);      //接收一次
                FL_SPI_WriteTXBuff(SPI1, 0xff);                //发送FF
                while(!(FL_SPI_IsActiveFlag_TXBuffEmpty(SPI1)));
                while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPI1)));
                byet=FL_SPI_ReadRXBuff(SPI1);//接收第二次
                FL_DelayUs(20);
                MS520_CS_H;
                return byet;
}


以上是代码,现在的问题是在数据读取过程中,FL_SPI_WriteTXBuff(SPI1, address|0x80);//发送读地址后,接收到的数据就是我之前写到寄存器的数据(按照从机芯片给的SPI读数据,应该是发送地址0,回的是个无效的数据,在发送地址1,回的是数据0),用示波器抓的波形,写是没有问题,但是读就是在发送FL_SPI_WriteTXBuff(SPI1, address|0x80);的时候回的是有效数据,在发送FL_SPI_WriteTXBuff(SPI1, 0xff);的时候会的是无效数据,从机SPI使用模式0(我配置的应该没问题),请大家帮忙看看哪里出的问题,谢谢。


顾博文 发表于 2021-8-19 09:31:12

首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。如果 cs ,sclk,mosi都正常,但miso没有正确波形,那就是从器件有问题。查从器件吧。严格按照从器件手册的波形比对。

gaojiqiang 发表于 2021-8-19 14:37:21

波特率现在配置的最小,4条线的波形都没有问题,就是在我读数据的时候(按照从设备数据应该是发送地址0时返回无效数据,在发送地址1时返回有效数据)在我发送地址0时返回的是我之前写入到该地址的数据。

gaojiqiang 发表于 2021-8-19 14:44:53

顾博文 发表于 2021-8-19 09:31
首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。如 ...

我把波型传上来了,我之前写入到该地址的数据26,在我读的时候无效字节会的26,有效字节回的15,您帮忙看一下

顾博文 发表于 2021-8-23 08:43:15

gaojiqiang 发表于 2021-8-19 14:44
我把波型传上来了,我之前写入到该地址的数据26,在我读的时候无效字节会的26,有效字节回的15,您帮忙看 ...

从器件到低是不是好的。你能确定么,在其他地方用过没有。 波形对,结果不对那就是从器件的问题。spi就是看波形的东西,如果波形对,结果不对那就是从器件有问题。

rogerzhong 发表于 2021-9-22 16:11:27

你的片选信号没有贴出来,是不是片选的问题?从初始化代码看到你是软件控制的片选,那么应该是
spiInitStruct.softControl = FL_ENABLE;

另外,片选信号好像并未初始化GPIO。

查询模式,发送前先等待发送缓冲区空标志是不是好一点?如下,
                while(!(FL_SPI_IsActiveFlag_TXBuffEmpty(SPI1)));// 等待发送缓冲区空标志位
                FL_SPI_WriteTXBuff(SPI1, 0xff);
                while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPI1)));   // 等待接收缓冲区非空标志位
                data = FL_SPI_ReadRXBuff(SPI1);      
页: [1]
查看完整版本: 【SPI】SPI读数据问题,FM33LC0XX,请大神解答一下,谢谢