你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H723 SPI配置为主机时,发送1帧数据为什么发送了多组CLK?

[复制链接]
简简单单…… 提问时间:2024-8-6 08:39 / 未解决

为什么调用一次HAL_SPI_TransmitReceive函数会发送4组CLK?

如图:93d937ae7c057fc193be5aa414155ee.jpg

//以下是初始化函数

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); } }

收藏 评论3 发布时间:2024-8-6 08:39

举报

3个回答
xmshao 回答时间:2024-8-6 11:12:38
按照你现在的配置,不应该发一帧数据而发多组时钟啊。我刚才测试过。


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位数据,输出很规矩。你检查下,看看是否哪里误会了。





简简单单…… 回答时间:2024-8-6 13:42:00

xmshao 发表于 2024-8-6 11:12
按照你现在的配置,不应该发一帧数据而发多组时钟啊。我刚才测试过。</p>
<p>

谢谢回复,搞了两天了没找到问题,不知什么原因,我把库换成最新的也是一样,没有用HAL_SPI_TransmitReceive函数,直接操作寄存器也是一样的!不过我发现一个规律:连续调HAL_SPI_TransmitReceive,CLK组数是调用次数+3,比如掉用5次CLK就是8组!

xmshao 回答时间:2024-8-7 09:45:47

简简单单…… 发表于 2024-8-6 13:42
谢谢回复,搞了两天了没找到问题,不知什么原因,我把库换成最新的也是一样,没有用HAL_SPI_Transmit ...

[md]哦, 我找时间再看看,能否复现你的情形。

==>后来,我这边又验证了一遍,没发现你说的问题,内存数据我放TCM还是其他RAM都问题,也尝试Cache的开关。不知你哪里出的问题。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版