|
为什么调用一次HAL_SPI_TransmitReceive函数会发送4组CLK? 如图: //以下是初始化函数 void bsp_cmd_spi_init(void) { HAL_SPI_DeInit(&hspi1); // bsp_cmd_spi_gpio_init(); hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; //选择主机模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; //两线接收和发送 hspi1.Init.DataSize = SPI_DATASIZE_16BIT; //数据长度16BIT hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //CLK空闲状态为高 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; //在CLK的第二个跳变沿数据被采样 hspi1.Init.NSS = SPI_NSS_SOFT; //NSS信号由软件管理 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; //波特率4分频,84/4 = 21MHz hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //数据传输从MSB位还是LSB位开始 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //不使用TI模式 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //不使用CRC计算 hspi1.Init.CRCPolynomial = 0x0; //CRC多项式选择 hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; //不启用NSSP信号 hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; //NSS极性 hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; //FIFO阈值 hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; //发送CRC初始化模式 hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; //接收CRC初始化模式 hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; //主模式下插入NSS信号和第一帧数据之间的延时(时钟周期数) hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; //主模式下插入两个数据帧之间的延时(时钟周期数) hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; //主接收器模式下控制连续SPI传输以及自动管理,以避免超限情况 hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; //控制备用功能GPIO状态 hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; //转换MISO/MOSI备用功能 if (HAL_SPI_Init(&hspi1) != HAL_OK) { while(1); } } |
STM32H750的上电BOR生效电压
STM32H563的QSPI接口不能读取W25Q256的后128MB数据
STM32C5 HAL SPI CRC 错误无法触发错误回调
HAL 库建议支持GPIO 同时配置为AF 与外部中断 EXTI
STM32H7的SMPS供电
STM32H7无法芯片
stm32cubeMx生成stm32H743IIT6 cmake工程时全局变量自动定义到DTCM段
CubeMX 生成的 STM32H7 CMake 工程打开串口 DMA 无法正常发送数据,如何解决?
TOF传感器无法正确识别物体
SPI 发送数据需要等待哪些状态标志位?
微信公众号
手机版
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x0;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_ENABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
测试代码如下,使用跟你一样的API函数。
while (1)
{
uint16_t txtmp = 0xAAAA;
HAL_SPI_TransmitReceive(&hspi1,(uint8_t *)&txtmp, (uint8_t *)spiDataRx,1, 0xaaa);
}
每次发1帧16位数据,输出很规矩。你检查下,看看是否哪里误会了。
谢谢回复,搞了两天了没找到问题,不知什么原因,我把库换成最新的也是一样,没有用HAL_SPI_TransmitReceive函数,直接操作寄存器也是一样的!不过我发现一个规律:连续调HAL_SPI_TransmitReceive,CLK组数是调用次数+3,比如掉用5次CLK就是8组!
[md]哦, 我找时间再看看,能否复现你的情形。
==>后来,我这边又验证了一遍,没发现你说的问题,内存数据我放TCM还是其他RAM都问题,也尝试Cache的开关。不知你哪里出的问题。