|
本帖最后由 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(我配置的应该没问题),请大家帮忙看看哪里出的问题,谢谢。
|
-
-
读SPI的波形,黄色时钟,蓝色MOSI,粉色MISO
-
发送地址时的数据
-
发送FF时的数据
|