国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32 HAL庫(kù) SPI主從雙機(jī)通信

這篇具有很好參考價(jià)值的文章主要介紹了STM32 HAL庫(kù) SPI主從雙機(jī)通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、簡(jiǎn)介

最近因?yàn)轫?xiàng)目需求,需要在一塊板子內(nèi)實(shí)現(xiàn)一個(gè)主機(jī)和五個(gè)從機(jī)的通信;
主機(jī)平臺(tái)選用的是STM32F407VGT6,從機(jī)平臺(tái)選用的是STM32F103C8T6;通信總線選用的是SPI總線。在構(gòu)想是覺(jué)得采用SPI進(jìn)行主從通信會(huì)很簡(jiǎn)單,但在實(shí)際開(kāi)發(fā)的過(guò)程中,各種坑,通信時(shí)而正常時(shí)而混亂。不過(guò)在不斷探究中,也逐漸發(fā)現(xiàn)了,各種問(wèn)題所在,借此記錄下來(lái),希望能幫助一些兄弟在開(kāi)發(fā)中避免一些坑。
本次實(shí)現(xiàn)的平臺(tái)如下:
通信主機(jī):

  • 芯片:STM32F103RCT6
  • 硬件平臺(tái):野火mini開(kāi)發(fā)板

通信從機(jī):

  • 芯片:STM32F103C8T6
  • 硬件平臺(tái):淘寶STM32F103C8T6最小系統(tǒng)開(kāi)發(fā)板

軟件:

  • HAL庫(kù)
  • MDK
  • STM32CubeMx

二、開(kāi)發(fā)過(guò)程中遇到的問(wèn)題

以下是我在開(kāi)發(fā)中遇到問(wèn)題:

1. 相同的數(shù)據(jù),每次發(fā)送,主從接收到都是不同的亂碼
開(kāi)發(fā)板之間沒(méi)共地,或者供地接觸不夠好;更換質(zhì)量較好的杜邦線,線材很影響信號(hào)質(zhì)量。
2. 通信不正常,很沒(méi)規(guī)律的不正常
檢查主從機(jī)的SPI外設(shè)配置,接線等。
3. 數(shù)據(jù)出現(xiàn)移位
SPI總線的時(shí)鐘質(zhì)量不好,出現(xiàn)不該出現(xiàn)的高低電平,讓從機(jī)認(rèn)為這是一bit數(shù)據(jù),出現(xiàn)移位寄存器移位,例如原本是8bit數(shù)據(jù),現(xiàn)在由于干擾從機(jī)接收到的可能是9bit或者10bit數(shù)據(jù),而從機(jī)實(shí)際接收到的數(shù)據(jù)只是最先傳入的8bit數(shù)據(jù)。
要保證良好的時(shí)鐘信號(hào),同時(shí)也可以將SPI的數(shù)據(jù)采集觸發(fā)改成時(shí)鐘下降沿觸發(fā)(好像是下降沿的信號(hào)質(zhì)量要比上升沿的信號(hào)質(zhì)量要更好),降低SPI通信速度。
在保證時(shí)鐘的穩(wěn)定的情況下,可通過(guò)復(fù)位從機(jī)的SPI外設(shè)來(lái)解決偶然發(fā)生的數(shù)據(jù)移位問(wèn)題。
4.從機(jī)spi啟動(dòng)比主機(jī)慢
在主機(jī)發(fā)出片選信號(hào)都需要加一段延時(shí),以確保從機(jī)的SPI外設(shè)比主機(jī)先啟動(dòng)。
stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)

三、硬件電路接線

NSS片選我們使用軟件控制方式:
stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)
stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)
所以我們主從機(jī)的SPI通信接線就直接按照手冊(cè)對(duì)接就行。
片選信號(hào)根據(jù)自己需求設(shè)置GPIO口,通過(guò)軟件控制,有效電平和標(biāo)準(zhǔn)SPI協(xié)議保持一樣就好,空閑高,有效低。

四、主從機(jī)SPI外設(shè)配置

4.1、主機(jī)配置

stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)
其中只有PA4、PA5、PA6、PA7是我們需要關(guān)注的,PA4是片選腳

4.2、從機(jī)配置

stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)
其中只有PA15、PB3、PB4、PB5是我們需要關(guān)注的,PA15是片選管腳。

4.3、接線

PA4 -> PA15(片選Nss)
PA5 -> PB3(SCK)
PA6 -> PB4(MISO)
PA7 -> PB5(MOSI)

五、如何清除移位寄存器

通過(guò)RCC寄存器復(fù)位SPI1外設(shè),在從新初始化SPI1外設(shè)完成移位寄存器清除

    if(SPI1->SR != 0x02)    //當(dāng)BSY為1時(shí),表示SPI正在忙于通信,但在通信還未開(kāi)始的時(shí)候BSY為1就可以表示移位寄存器存在干擾數(shù)據(jù)
    {
        //只用通過(guò)RCC復(fù)位整個(gè)SPI外設(shè)后重新初始化,才能清除spi移位寄存器中的殘留數(shù)據(jù)
        __HAL_RCC_SPI1_FORCE_RESET();
        __HAL_RCC_SPI1_RELEASE_RESET();
        MX_SPI1_Init();
        printf("SPI復(fù)位,清空移位寄存器殘留數(shù)據(jù)\n");
        HAL_Delay(10);
    }

六、代碼

6.1、主機(jī)代碼

uint8_t rx_buffer[22]={'1','2','3',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8_t tx_buffer[22]={0x00,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16};
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("主從測(cè)試開(kāi)始\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //SPI通信
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
    HAL_Delay(2);      //通過(guò)延時(shí)保證從機(jī)SPI外設(shè)比主機(jī)先啟動(dòng)
    HAL_SPI_TransmitReceive(&hspi1,tx_buffer,rx_buffer,8,100);
    HAL_Delay(10);
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
    printf("接收到的數(shù)據(jù):");
    for(num = 0;num < 8;num++)
    {
        printf("%#x ",rx_buffer[num]);
    }
    memset(rx_buffer,0,8);
    printf("\n");
    HAL_Delay(5000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
//重映射printf函數(shù)
int fputc(int ch,FILE*stream)
{
uint8_t c =ch;
HAL_UART_Transmit(&huart1,&c,1,50);
return ch;
}

6.2、從機(jī)代碼

uint8_t Tx_data[8]={0x87,0xa2,0x41,0x02,0x93,0x04,0x05,0x06};
uint8_t Rx_data[8]={0};
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    bsp_spi_eeror(&hspi1);  //通信錯(cuò)誤判斷
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15) == 0)    //識(shí)別NSS線(低電平有效)
    {
    HAL_SPI_TransmitReceive(&hspi1,Tx_data,Rx_data,8,100);
        
    while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15) == 0){};    //等待 主機(jī) 釋放 片選   

    printf("spi從機(jī)Rx_dete:");
    for(int i=0 ; i < 8;i++)
    {
        printf("%#x ",Rx_data[i]);
    }
    memset(Rx_data,0,8);
    printf("\n主機(jī)以釋放nss線\n");
    }

    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

七、效果展示

左側(cè)為主機(jī)串口顯示,右側(cè)為從機(jī)串口顯示;與程序中的數(shù)據(jù)對(duì)比可發(fā)現(xiàn)收發(fā)數(shù)據(jù)傳輸均正確
stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)

邏輯分析儀顯示數(shù)據(jù):由于中間片選出現(xiàn)了一次高電平干擾,導(dǎo)致后部分的數(shù)據(jù)分析異常,但實(shí)際傳輸?shù)臄?shù)據(jù)是正常的。
stm32f103spi主從通,STM32 HAL庫(kù),stm32,嵌入式硬件,單片機(jī)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-797121.html

到了這里,關(guān)于STM32 HAL庫(kù) SPI主從雙機(jī)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32——STM32F103時(shí)鐘解析(正點(diǎn)原子資料+HAL庫(kù)代碼分析)

    STM32——STM32F103時(shí)鐘解析(正點(diǎn)原子資料+HAL庫(kù)代碼分析)

    上次寫(xiě)系統(tǒng)時(shí)鐘解析的時(shí)候說(shuō)出一篇103的時(shí)鐘解析,我就整理HAL庫(kù)開(kāi)發(fā)的正點(diǎn)的資料,給小白梳理,我也是小白,不做權(quán)威使用。 在 STM32 中,有五個(gè)時(shí)鐘源,為 HSI、HSE、LSI、LSE、PLL。從時(shí)鐘頻率來(lái)分可以分為高速時(shí)鐘源和低速時(shí)鐘源,在這 5 個(gè)中 HIS,HSE 以及 PLL 是高速時(shí)鐘

    2024年02月19日
    瀏覽(25)
  • 基于STM32F103HAL庫(kù)的聲音定位系統(tǒng)

    基于STM32F103HAL庫(kù)的聲音定位系統(tǒng)

    這是一道學(xué)校出的電賽題目,要求在100*100cm的平面上實(shí)現(xiàn)定位實(shí)現(xiàn)聲音定位。由于一米太大了,我們就做了40cm的,下面的講解我按照40厘米的寫(xiě)。用到的處理器是stm32f103c8t6接下來(lái)分享一下調(diào)試心得。 硬件部分需要制作發(fā)聲裝置和接收裝置,詳細(xì)可以

    2024年02月14日
    瀏覽(29)
  • STM32 F103C8T6學(xué)習(xí)筆記7:雙機(jī)無(wú)線串口通信

    STM32 F103C8T6學(xué)習(xí)筆記7:雙機(jī)無(wú)線串口通信

    今日嘗試配通倆個(gè)C8T6單片機(jī)之間的無(wú)線串口通信,文章提供原理,源碼,測(cè)試效果圖,測(cè)試工程下載: 目錄 傳輸不規(guī)范問(wèn)題: 串口通信資源: 單個(gè)串口資源理解: 單片機(jī)串口資源: 測(cè)試目標(biāo)與測(cè)試硬件連接: 串口初始化與串口中斷接收邏輯: 串口初始化: 初步測(cè)試能否

    2024年02月09日
    瀏覽(17)
  • HAL庫(kù)(STM32CubeMX)之外部中斷(STM32F103C8T6)

    HAL庫(kù)(STM32CubeMX)之外部中斷(STM32F103C8T6)

    HAL庫(kù)(STM32CubeMX)——ADC學(xué)習(xí)總結(jié)(包含單次/連續(xù)模式下的輪詢(xún)/中斷/DMA)(藍(lán)橋杯STM32G431RBT6) HAL庫(kù)(STM32CubeMX)——DAC學(xué)習(xí)(STM32G431RBT6) HAL庫(kù)(STM32CubeMX)——USART配置(中斷接收/STM32G431RBT6) HAL庫(kù)(STM32CubeMX)——基本定時(shí)器、PWM、輸入捕獲、輸出比較、互補(bǔ)式PWM等綜合學(xué)習(xí)(STM32

    2024年02月06日
    瀏覽(26)
  • 使用STM32F103的SPI+DMA驅(qū)動(dòng)ws2812 LED

    使用STM32F103的SPI+DMA驅(qū)動(dòng)ws2812 LED

    目錄 前言 一、WS2812協(xié)議 1.1 數(shù)據(jù)傳輸編碼方式: ?1.2 傳輸?shù)臄?shù)據(jù)結(jié)構(gòu) 二、驅(qū)動(dòng)方式:SPI+DMA 2.1 原理介紹 2.2 SPI+DMA操作 ?2.3 編寫(xiě)代碼 2.4 使用 三 總結(jié) 參考文章 主要使用的STM32F103C8T6芯片的SPI+DMA方式實(shí)現(xiàn)WS2812的驅(qū)動(dòng)協(xié)議,總體可以看作是使用SPI來(lái)實(shí)現(xiàn)一種通信協(xié)議來(lái)發(fā)送信號(hào)。

    2024年02月09日
    瀏覽(30)
  • STM32F103C8T6(HAL庫(kù))驅(qū)動(dòng)舵機(jī)

    STM32F103C8T6(HAL庫(kù))驅(qū)動(dòng)舵機(jī)

    常見(jiàn)的舵機(jī)分為360°和180°兩種,本次對(duì)180°舵機(jī)進(jìn)行驅(qū)動(dòng),舵機(jī)驅(qū)動(dòng)需要通過(guò)PWM信號(hào)進(jìn)行驅(qū)動(dòng)。本文通過(guò)定時(shí)器中的PWM信號(hào)設(shè)定使得SG90舵機(jī)進(jìn)行不同角度的轉(zhuǎn)動(dòng)。 對(duì)于舵機(jī)的驅(qū)動(dòng),需要20ms的脈沖,高電平時(shí)間在0.5ms-2.5ms區(qū)間即可控制舵機(jī)在0-180°角度進(jìn)行轉(zhuǎn)動(dòng)。常見(jiàn)角度對(duì)應(yīng)

    2024年02月05日
    瀏覽(23)
  • stm32f103與openmv串口通信

    串口通信是指通過(guò)串行通信接口進(jìn)行數(shù)據(jù)傳輸?shù)囊环N通信方式。在串口通信中,數(shù)據(jù)被分成一個(gè)個(gè)的字節(jié),按照一定的順序依次發(fā)送和接收。串口通信通常使用UART(通用異步收發(fā)傳輸)協(xié)議進(jìn)行數(shù)據(jù)傳輸。 串口通信在嵌入式系統(tǒng)中應(yīng)用非常廣泛,其主要用途包括: 調(diào)試和監(jiān)

    2024年02月13日
    瀏覽(22)
  • STM32開(kāi)發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    STM32開(kāi)發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    ??《上一篇》 ???《主目錄》 ???《下一篇》 了解 RS485 Modbus協(xié)議技術(shù) 。本實(shí)驗(yàn)是基于STM32F103開(kāi)發(fā) 實(shí)現(xiàn) 通過(guò)RS-485實(shí)現(xiàn)modbus協(xié)議。 準(zhǔn)備好了嗎?開(kāi)始我的show time。 1、硬件開(kāi)發(fā)準(zhǔn)備 主控:STM32F103ZET6 RS485收發(fā)器:SP3485P 2、軟件開(kāi)發(fā)準(zhǔn)備 軟件開(kāi)發(fā)使用虛擬機(jī) + VScode + STM32Cub

    2024年02月03日
    瀏覽(25)
  • 正點(diǎn)原子STM32F103精英版+HAL庫(kù)實(shí)現(xiàn)4×4矩陣按鍵檢測(cè)

    正點(diǎn)原子STM32F103精英版+HAL庫(kù)實(shí)現(xiàn)4×4矩陣按鍵檢測(cè)

    首先聲明,本人小白一枚,所做的工作都是借鑒網(wǎng)上的大佬+自己摸索,但是都是親測(cè)實(shí)際有效的。 因?yàn)樗枰墓δ荛_(kāi)發(fā)板自帶按鍵不夠用,所以購(gòu)買(mǎi)了4×4矩陣按鍵,當(dāng)時(shí)購(gòu)買(mǎi)的時(shí)候以為一個(gè)按鍵對(duì)應(yīng)一個(gè)IO口,后來(lái)發(fā)現(xiàn)不是這樣的,會(huì)浪費(fèi)太多的IO口,4×4矩陣鍵盤(pán)用8個(gè)

    2024年02月06日
    瀏覽(78)
  • STM32F103C8T6(HAL庫(kù)函數(shù) - 內(nèi)部Flash操作)

    STM32F103C8T6(HAL庫(kù)函數(shù) - 內(nèi)部Flash操作)

    STM32F103C8T6 內(nèi)部Flash 為 64KB,本次將對(duì)他多余空間進(jìn)行讀寫(xiě)。 數(shù)據(jù)手冊(cè)下載 STM32F103x8/STM32F103xB 數(shù)據(jù)手冊(cè) 包含F(xiàn)lash Memory Page分布 STM32F設(shè)備命名 設(shè)備容量類(lèi)型 中容量類(lèi)型 內(nèi)部空間介紹 Flash Memory 從 0x0800 0000 ~ 0x0801 FFFF 頁(yè)分布1K每頁(yè), STM32F103C8T6 只有64KByte, 那就是64頁(yè) 使用 controll

    2024年01月21日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包