使用 SPI 未在正确的时刻设置芯片使能
Posted
技术标签:
【中文标题】使用 SPI 未在正确的时刻设置芯片使能【英文标题】:Chip Enable not setting at right moment using SPI 【发布时间】:2020-02-10 13:35:59 【问题描述】:我试图在 SPI 传输之前将引脚的芯片启用 (CE) 设置为高电平,并在完成传输(TX 或 RX)后返回低电平。我正在使用 NRF24L01 和 Nucleo-F303。据说当 CE 高时,我可以对 NRF24L01 进行真正的 SPI 传输。但是,即使在真正的传输尚未完成之前,CE 引脚也会暂时变低,然后再次变高
其余的引脚似乎正在相应地同步。我如何在进行 SPI 传输之前让 CE 引脚准确地变高,然后在完成或不再进行传输时变低。
这是我尝试解决问题的方法
int main(void)
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
HAL_Delay(5);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
uint8_t data[6] = 0x5C, 0xBA, 0xBB, 0x4D, 0x5E, 0xFB,;
uint8_t data1[6] = 0;
while (1)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
if(HAL_SPI_TransmitReceive(&hspi1, data, data1, 6, HAL_MAX_DELAY) == HAL_OK)
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
这就是我配置 GPIO_PIN_3 的方式
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // digital Output
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
【问题讨论】:
【参考方案1】:通常 SPI 的 Slave Select 信号为低电平有效,但您可以通过位 SSIOP 更改此行为(它是 STM32H7 上的位名称,在其他 STM32 上可能不同)。
关于您的另一个问题,从选择信号在两个字节之间变为非活动状态,您可以通过位 SSOM 更改该行为。
参考手册中通常很好地描述了不同的 SPI 配置。
【讨论】:
【参考方案2】:我最终选择了裸机,因为这些库延迟了很多并且有很多抽象层
【讨论】:
如果您的代码不必在不同型号的 STM32 uCs 上运行,这是正确的决定以上是关于使用 SPI 未在正确的时刻设置芯片使能的主要内容,如果未能解决你的问题,请参考以下文章