|
为什么调用一次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); } } |
使用STM32H743IIT6,读写MCU内部Flash固定地址与固定长度的区域,出现随机性HardFault错误,请问是什么原因?
STM32H7A3VGH6Q D1、d2、E1、E2是SMPS功能对应的引脚,裸片量测D2与C1、D1对应的地没有短路现象,PCB板量测也没有短路,但芯片贴到板上D2 VLXSMPS就会与地短路。不知是啥原因。是否芯片型号与批次不对?
mmt 工具如何管理NAND和LCDinterface 设备
调试器如何通过AP0~AP3访问H757?
STM32H7的LSE起振问题
使用STM32H7A3的FMC接口驱动LCD 是否可以用DMA传输数据
stm32h743 lan8720 cube配置lwip无法ping通
型号相同,尾椎不一样
STM32F1 SPI2 无法通信
请问有没有人见过这样的报错
微信公众号
手机版
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的开关。不知你哪里出的问题。