嵌入式技术论坛
直播中

张虎豹

7年用户 1593经验值
私信 关注
[问答]

求助,RTThread的spi rt_spi_send_then_recv API 与HAl库的HAL_SPI_TransmitReceive使用是一样的吗?

RTThread的spi rt_spi_send_then_recv API 与HAl库的HAL_SPI_TransmitReceive使用是一样的吗

我使用RTTread的spiAPI rt_spi_send_then_recv(ble_spi, &header_master, HEADER_SIZE, &header_slave, HEADER_SIZE);发送一个header,同时收到的回复是:0x04ff030100,即从机芯片的异常返回
1.png

将对应的API换成 HAL_SPI_TransmitReceive(&hspi1, header_master, header_slave, HEADER_SIZE, BUS_SPI1_POLL_TIMEOUT);,同时收到的回复是: 0xff09010600, 即正确的数据大小约定包
2.png

我的SPI初始化代码如下:

/* SPI -----------------------------------------------*/

#define SPI_DEVICE_NAME "spi10" /* SPI 设备名称 */

struct rt_spi_device *ble_spi = RT_NULL;

ble_spi = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));

if(RT_NULL == ble_spi)

{

rt_kprintf("Failed to malloc the spi device.");

return -RT_ENOMEM;

}

if (RT_EOK != rt_spi_bus_attach_device(ble_spi, "spi10", "spi1", RT_NULL))

{

rt_kprintf("Failed to attach the spi device.");

return -RT_ERROR;

}

/* spi设备配置 */

struct rt_spi_configuration cfg;

cfg.data_width = 8;

cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_1 | RT_SPI_MSB; // CPOL 0 CPHA 1

cfg.max_hz = 1 * 1000 * 1000; /* 1M */

if (RT_EOK != rt_spi_configure(ble_spi, &cfg)) {

rt_kprintf("Failed to config the spi device.");

return -RT_ERROR;

}

配置的数据位宽 工作模式 和频率应该都是没有问题的(否则应该不能准确收到异常返回0x04ff030100)

我点开rt_spi_send_then_recv 的源码看着好复杂,

这个API在发送的工作上和HAL_SPI_TransmitReceive有什么时序的区别吗

回帖(2)

YYXIAO

2023-9-8 16:27:58
用错API了 rt_spi_transfer才是同时双工收发
举报

神船大幅

2023-9-21 16:23:35
*/

/*使用的spi为SPI1,注意SPI的时钟频率不能超过从机芯片的最大频率*/

#include "stm32f4xx_hal.h"

#define SPI1_BAUDRATE 8000000 /*SPI1的时钟频率为8MHz*/

SPI_HandleTypeDef hspi1;

void SPI1_Init(void) {
  /*定义SPI初始化结构体*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  /*使能SPI1*/
  __HAL_RCC_SPI1_CLK_ENABLE();
  /*初始化SPI1*/
  HAL_SPI_Init(&hspi1);
}

/*使用SPI1发送和接收数据*/
uint8_t SPI1_Send_Recv(uint8_t* txdata, uint8_t* rxdata, uint16_t datalength, uint32_t timeout) {
  /*发送和接收数据*/
  if(HAL_SPI_TransmitReceive(&hspi1, txdata, rxdata, datalength, timeout) == HAL_OK) {
    return 0;
  }
  else {
    return 1;
  }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分