查看: 4078|回复: 5

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

[复制链接]

1

主题

1

帖子

31

积分

初级工程师

Rank: 1

积分
31
发表于 2021-8-18 15:30:12 | 显示全部楼层 |阅读模式
本帖最后由 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(我配置的应该没问题),请大家帮忙看看哪里出的问题,谢谢。


1.png

读SPI的波形,黄色时钟,蓝色MOSI,粉色MISO

读SPI的波形,黄色时钟,蓝色MOSI,粉色MISO

发送地址时的数据

发送地址时的数据

发送FF时的数据

发送FF时的数据
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-8-19 09:31:12 | 显示全部楼层
首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。  如果 cs ,sclk,mosi都正常,但miso没有正确波形,那就是从器件有问题。查从器件吧。严格按照从器件手册的波形比对。
回复

使用道具 举报

1

主题

1

帖子

31

积分

初级工程师

Rank: 1

积分
31
 楼主| 发表于 2021-8-19 14:37:21 | 显示全部楼层
波特率现在配置的最小,4条线的波形都没有问题,就是在我读数据的时候(按照从设备数据应该是发送地址0时返回无效数据,在发送地址1时返回有效数据)在我发送地址0时返回的是我之前写入到该地址的数据。
回复

使用道具 举报

1

主题

1

帖子

31

积分

初级工程师

Rank: 1

积分
31
 楼主| 发表于 2021-8-19 14:44:53 | 显示全部楼层
顾博文 发表于 2021-8-19 09:31
首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。  如 ...

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

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-8-23 08:43:15 | 显示全部楼层
gaojiqiang 发表于 2021-8-19 14:44
我把波型传上来了,我之前写入到该地址的数据26,在我读的时候无效字节会的26,有效字节回的15,您帮忙看 ...

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

使用道具 举报

1

主题

16

帖子

357

积分

高级工程师

Rank: 3Rank: 3

积分
357
发表于 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);      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表