一、接口介绍
1.1HAL_SPI_TransmitReceive()
参数1:SPI外设句柄;
参数2:要发送的数据缓冲区的指针;
参数3:接收数据的缓冲区的指针;
参数4:发送和接收的数据字节数;
参数5:超时时间。
1.2HAL_SPI_Transmit()__去掉参数3
1.3HAL_SPI_Receive()__去掉参数2
二、Cube配置
三、编程
void T3(void const * argument)
{
/* USER CODE BEGIN T3 */
printf("serial start...\r\n");
uint16_t ID = W25Qxx_ReadID();
printf("%#x\r\n", ID);
ID = W25QReadID();
printf("%#x\r\n", ID);
printf("serial end...\r\n");
/* Infinite loop */
for(;;)
{
osDelay(1);
}
/* USER CODE END T3 */
}
uint8_t SPI1_TransmitReceive(uint8_t Senddata) {
uint8_t Receivedata;
HAL_SPI_TransmitReceive(&hspi1, &Senddata, &Receivedata, 1, 1000);
return Receivedata;
}//发送一个字节并返回一个字节
uint16_t W25QReadID(void) {
uint16_t res = 0;
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 0);//select
SPI1_TransmitReceive(0x90);//查阅W25Q的要求
SPI1_TransmitReceive(0x00);
SPI1_TransmitReceive(0x00);
SPI1_TransmitReceive(0x00);
res |= SPI1_TransmitReceive(0xFF) << 8;//发送任意数据,目的在于接收返回值
res |= SPI1_TransmitReceive(0xFF);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 1);
return res;
}
...
uint16_t W25Qxx_ReadID(void)
{
uint16_t res;
uint8_t Txbuff[4] ={0x90, 0x00, 0x00, 0x00};
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 0);//select
HAL_SPI_Transmit(&hspi1,(uint8_t *)Txbuff, 4, 4000);
HAL_SPI_Receive(&hspi1,(uint8_t *)&res, 2 , 2000);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, 1);
return res;
}
四、现象