回馈帖--STM32F4的SPI双机通信成功

2019-07-20 15:56发布

    

图1
STM32F4的外设例程库里的SPI双机通信写的较复杂,理解起来费劲。
今天早上终于把SPI的双机通信验证通过了,MARK一下。

图2
头文件里宏定义
图3
疑惑解答一: SPI1的引脚映射可以是不是在不同组的两个SPI1映射吗,如一个A口,一个B口吗?
答: 可以,只需打开引脚复用功能就可,无需其他设置。

疑惑解答二:
SPI1的PB3,PB4是JTAG引脚,可以当作正常的IO口吗?
答: 不可以,需禁用JTAG引脚功能,详细见STM32F4参考手册的6.3.2章节,可以配置成JTAG-DP Disabled and SW-DP Enabled。

  连线见图1,从机通信的程序见图2和图3,采用的SPI1,主机的SPI配置类似,只是把从机模式改成主机模式就行。
  下一步接着调SPI的DMA的配置。








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
苹果
2019-07-20 19:37
回复【楼主位】yongyooh:
---------------------------------
我现在用STM32F4 SPI+DMA不成功!! 请指教
但是我单独用SPI发送是没有问题的,想你赐教下
 DMA_DeInit(DMA1_Stream7);
   /* DMA1 Stream6 channe4 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  //DMA1 拥有1~7,DMA2拥有1~5;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI3->DR;//外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&aTxBuffer;//内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//DMA传输方向 内存到外设
  DMA_InitStructure.DMA_BufferSize =3;//设置DMA在传输时缓存区的长度
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设1
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA的内存递增模式1
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度 长8bit
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//内存数据字长  8bit
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//设置DMA的传输模式:连续不断的循环模式 这里使用正常模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA优先级别最高,一共有四种
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //不能内存到内存传输   2    
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;//2
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA1_Stream7, &DMA_InitStructure);
 /* Enable DMA SPI TX Stream */
  DMA_Cmd(DMA1_Stream7,ENABLE);
  DMA_Cmd(DMA1_Stream7,ENABLE);

  /* Enable DMA SPI RX Stream */
//  DMA_Cmd(DMA1_Stream0,ENABLE);

  /* Enable SPI DMA TX Requsts */
  SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE);

  /* Enable SPI DMA RX Requsts */
 // SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);
  /* Enable the SPI peripheral */
  SPI_Cmd(SPI3, ENABLE); 
  DMA_ITConfig(DMA1_Stream7,DMA_IT_TC,ENABLE);//打开中断传输完成中断
//配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

一周热门 更多>