大家好,最近在基于
STM32cube库调试spi口,遇到一些问题向大家请教
1.spi发射寄存器是8位的,那么配置成16位的如何一次性发送一个16位的数据呢?
AL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
其中pdata是一个8位数据的指针呀!
2.我在调试过程中,发射数据遇到在第11位,12位恒定输出高电平
如下面输出1时,示波器检测到的数据,蓝 {MOD}为时钟,黄 {MOD}为数据
3配置代码是通过CubeMX配置的
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direc
tion = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
// hspi2.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi2);
}
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Peripheral DMA init*/
hdma_spi2_tx.Instance = DMA1_Channel5;
hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi2_tx.Init.MemInc = DMA_MINC_DISABLE;
hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi2_tx.Init.Mode = DMA_NORMAL;
hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_spi2_tx);
__HAL_LINKDMA(hspi,hdmatx,hdma_spi2_tx);
/* Peripheral interrupt init*/
HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI2_IRQn);
4调用代码
if(HAL_SPI_Transmit_IT(&hspi2, (uint8_t*)SPI_aTxBuffer,1) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
while (HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY)
{
}
1.直接配置16位,调用这个函数,只不过pdata直接指向一个16位的数据就可以输出16位的,非常方便
一周热门 更多>