?一、實(shí)現(xiàn)SPI雙機(jī)通信
主要功能:STM32F407VET6作為主機(jī),STM32F103ZET6作為從機(jī)實(shí)現(xiàn)F4通過SPI接口發(fā)送數(shù)據(jù)給F1進(jìn)行串口打印功能
主要是使用STM32cubemx進(jìn)行相關(guān)配置(使用這個(gè)軟件不能只用于生成代碼,要學(xué)會(huì)讀懂生成的每一句代碼這樣才方便后期調(diào)試,不然出現(xiàn)問題根本找不到)
二、主機(jī)F4相關(guān)配置
1、配置SYS
選擇Serial Waire進(jìn)行調(diào)試(通常都選這個(gè))
2、配置RCC
3、配置串口
配置波特率(并未開啟串口中斷,不需要使用)?
串口重定向(方便使用printf進(jìn)行打印,這里我添加在usart.c文件夾下)
#include "usart.h"
/* USER CODE BEGIN 0 */
#include "stdio.h"
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機(jī)模式
void _sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR=(uint8_t)ch;
return ch;
}
/* USER CODE END 0 */
UART_HandleTypeDef huart1;
/* USART1 init function */
4、配置SPI接口
配置模式未主機(jī)模式,開啟NSS位進(jìn)行片選(可以增加穩(wěn)定性)
IO端口:
注:注意SPI的極性和相位要和從機(jī)保持一致
5、配置時(shí)鐘樹
直接選擇最大即可
6、代碼部分
在while循環(huán)直接添加
uint8_t data[5] = {0x00,0x11,0x22,0x33,0x44};
for(int i=0; i<fnum;i++)
{
HAL_SPI_Transmit_DMA(&hspi1,&ReadBuffer[i],1);
HAL_Delay(1);
}
至此,F(xiàn)4部分基本配置完成,接下來才是重點(diǎn)!!
三、從機(jī)F1相關(guān)配置
1、配置SYS
同上
2、配置RCC
同上
3、配置串口
同上
4、SPI配置
選擇從機(jī)模式,輸入片選,以及極性和相位
5、開啟SPI中斷相關(guān)
開啟SPI中斷,從機(jī)主要是采取中斷的方式進(jìn)行接收
6、時(shí)鐘樹配置
?同意配置最大即可
?生成代碼,進(jìn)入代碼內(nèi)部進(jìn)行編寫
7、修改中斷函數(shù)
在stm32f1xx_it.c文件下找到SPI2_IRQHandler添加一下內(nèi)容及開啟中斷重復(fù)接收
/**
* @brief This function handles SPI2 global interrupt.
*/
void SPI2_IRQHandler(void)
{
/* USER CODE BEGIN SPI2_IRQn 0 */
/* USER CODE END SPI2_IRQn 0 */
HAL_SPI_IRQHandler(&hspi2);
/* USER CODE BEGIN SPI2_IRQn 1 */
while(HAL_SPI_Receive_IT(&hspi2,(uint8_t *)spi_buffer, RXBUFFERSIZE) != HAL_OK)
{
}
/* USER CODE END SPI2_IRQn 1 */
}
編寫中斷回調(diào)函數(shù)
?添加在stm32f1xx_it.c最后即可
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef* spiHandle)
{
if(spiHandle->Instance == SPI2)
{
if(spi_rx_cnt < SPI_REC_LEN)
{
ReadBuffer[spi_rx_cnt] = spi_buffer[0];
spi_rx_cnt++;
printf("buffer: 0x%x\r\n",spi_buffer[0]);
}
}
}
8、主函數(shù)添加
HAL_SPI_Receive_IT(&hspi2,(uint8_t *)spi_buffer, RXBUFFERSIZE);
至此從機(jī)相關(guān)也編寫完畢,在SPI回調(diào)函數(shù)中,會(huì)打印接收到的內(nèi)容如下:
?出現(xiàn)已下現(xiàn)象即可表明通信成功!?。⊥瓿闪薙PI雙機(jī)燒錄的第一步,下一章講講解STM32從SD卡讀取bin文件并通過SPI接口發(fā)送給從機(jī)文章來源:http://www.zghlxwxcb.cn/news/detail-717383.html
需要源代碼的請(qǐng)留言,創(chuàng)造不易歡迎點(diǎn)贊收藏,感謝支持文章來源地址http://www.zghlxwxcb.cn/news/detail-717383.html
到了這里,關(guān)于STM32 通過HAL庫實(shí)現(xiàn)雙機(jī)SPI程序燒錄之一SPI雙機(jī)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!