![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
为什么调用一次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); } } |
当io引脚接0v时,stm32h750 ADC获取值跳动特别大。接上待测电量直接就是满值,这个是什么原因导致?有什么办法可以解决?
stm32h743vit芯片在使能dma1时钟之后,sram_d2的内容会改成其他值
STM32H725RGV6 電源規劃
搜所了博客用stm32cubemx写一个简单adc获取值的例子 ,烧录到板子里导致芯片(STM32H750XBH6)锁死(怀疑配置的时钟频率和板子要求的不一样),不知道如何解除 芯片死锁。
STM32H747-DISCO烧录问题
stm32h745iit6通过stm32cubeprogrammer的usb进行iap时无法正确连接的问题
如何调整CubeMX的默认引脚
STM32H7RS-DK如何调试阶段在EXTRAM中烧写代码并进行调试。
STM32F407 用定时器控制SPI传输的相关问题
STM32H7S78-DK ADC参考电压选择。
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的开关。不知你哪里出的问题。