芯片启用未使用 SPI 在正确的时刻设置
Chip Enable not setting at right moment using SPI
我正在尝试将引脚的芯片启用 (CE) 设置为在 SPI 传输之前变高并在完成传输(TX 或 RX)后变回低电平。我正在使用 NRF24L01 和 Nucleo-F303。据说当 CE 很高时,那是我可以对 NRF24L01 进行真正的 SPI 传输的时候。然而,即使在真正的传输尚未完成之前,CE 引脚会暂时变低然后再次变高
其余的引脚似乎相应同步。我如何让 CE 引脚在进行 SPI 传输之前准确地变高,然后在完成或不再进行任何传输时变低。
这是我尝试解决问题的方法
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);
通常 SPI 的 Slave Select 信号是低电平有效,但您可以通过位 SSIOP 更改此行为(它是 STM32H7 上的位名称,在其他 STM32 上可能不同)。
关于您的另一个问题,Slave Select 信号在两个字节之间变为非活动状态,您可以通过位 SSOM 更改该行为。
参考手册中通常对不同的 SPI 配置进行了很好的描述。
我最终选择了裸机,因为库有很多延迟并且有很多抽象层
我正在尝试将引脚的芯片启用 (CE) 设置为在 SPI 传输之前变高并在完成传输(TX 或 RX)后变回低电平。我正在使用 NRF24L01 和 Nucleo-F303。据说当 CE 很高时,那是我可以对 NRF24L01 进行真正的 SPI 传输的时候。然而,即使在真正的传输尚未完成之前,CE 引脚会暂时变低然后再次变高
其余的引脚似乎相应同步。我如何让 CE 引脚在进行 SPI 传输之前准确地变高,然后在完成或不再进行任何传输时变低。
这是我尝试解决问题的方法
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);
通常 SPI 的 Slave Select 信号是低电平有效,但您可以通过位 SSIOP 更改此行为(它是 STM32H7 上的位名称,在其他 STM32 上可能不同)。
关于您的另一个问题,Slave Select 信号在两个字节之间变为非活动状态,您可以通过位 SSOM 更改该行为。
参考手册中通常对不同的 SPI 配置进行了很好的描述。
我最终选择了裸机,因为库有很多延迟并且有很多抽象层