图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的配置。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
我现在用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);
一周热门 更多>