【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(我配置的应该没问题),请大家帮忙看看哪里出的问题,谢谢。
首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。如果 cs ,sclk,mosi都正常,但miso没有正确波形,那就是从器件有问题。查从器件吧。严格按照从器件手册的波形比对。 波特率现在配置的最小,4条线的波形都没有问题,就是在我读数据的时候(按照从设备数据应该是发送地址0时返回无效数据,在发送地址1时返回有效数据)在我发送地址0时返回的是我之前写入到该地址的数据。 顾博文 发表于 2021-8-19 09:31
首先确认波形,波特率越慢越好,波形尽量少畸变。用示波器把 ,cs 、sclk, mosi, miso 都监控起来。如 ...
我把波型传上来了,我之前写入到该地址的数据26,在我读的时候无效字节会的26,有效字节回的15,您帮忙看一下 gaojiqiang 发表于 2021-8-19 14:44
我把波型传上来了,我之前写入到该地址的数据26,在我读的时候无效字节会的26,有效字节回的15,您帮忙看 ...
从器件到低是不是好的。你能确定么,在其他地方用过没有。 波形对,结果不对那就是从器件的问题。spi就是看波形的东西,如果波形对,结果不对那就是从器件有问题。 你的片选信号没有贴出来,是不是片选的问题?从初始化代码看到你是软件控制的片选,那么应该是
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]