在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

485通信實驗

汽車電子技術 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-03-01 14:52 ? 次閱讀

17.1 485協議概述

485是屬于OSI模型物理層的電氣標準,屬于2線制,半雙工,多點通信標準,485總線采用兩根線路的電壓差來傳遞信號,485兩根線路名稱為A和B,當線路A與線路B的電壓差為+2 +6V時表示邏輯電平1,當線路A與線路B的電壓差為-2 -6V時表示邏輯電平0,485與232協議都屬于串口通信協議,都是采用轉換芯片將USART接口電平轉換為485電平或者232電平,485協議傳輸速率在10米時候可達35Mbps,在1200米是可達到100Kbps,最大支持總線掛載32個節點,如果采用特制的芯片可以達到400個節點。

485電氣連接中,為了進行阻抗匹配,需要在兩根線路中并聯一個120Ω的電阻,一般是一個設備并聯一個,所以485協議只是之前USART協議的另一種表現形式,通過之前掌握的USART配置,借助485轉換芯片就可以完成485通信線路的搭建。

17.2 實驗例程

采用STM32F103ZET6芯片的PA2(USART2_TXD)和PA3(USART2_RXD)和一個485轉換芯片SP485來實現RS485通信。其中SP485引腳描述如下圖所示。

圖片

序號 名稱 功能描述
1 RO 接收器輸出端:當RE為低電平時,若A-B≧200mV,RO輸出為高電平若A-B≦-200mV,RO輸出為低電平
2 RE 接收器輸出使能控制當RE接低電平時,接收器輸出使能,RO輸出有效當RE接高電平時,接收器輸出禁能,RO為高阻態RE接高電平且DE接低電平時,器件進入低功耗關斷模式
3 DR 驅動器輸出使能控制DE接高電平時驅動器輸出有效,DE為低電平時輸出為高阻態RE接高電平且DE接低電平時,器件進入低功耗關斷模式
4 DI DI驅動器輸入DE為高電平時,DI上的低電平使驅動器同相端輸出為低電平,反相端輸出為高電平DI上的高電平將使同相端輸出為高電平,反相端輸出為低
5 GND 電源
6 A 接收器同相輸入和驅動器同相輸出端
7 B 接收器反相輸入和驅動器反相輸出端
8 VCC 電源,推薦3.3V

根據上面的芯片描述,我們可以得到連接如下所示。

USART2_TXD(即PA2)接RO端

USART2_RXD(即PA3)接DI端

PD7接DR與RE端

(1)創建rs485.h文件,輸入以下代碼。

/*********************************************************************************************************
                  RS485    驅    動    文    件
*********************************************************************************************************/
#ifndef _RS485_H_
#define _RS485_H_


#include "sys.h"
/*********************************************************************************************************
                硬    件    端    口    定    義
*********************************************************************************************************/
#define RS485_EN  PDout( 7 )
/*********************************************************************************************************
                數    據    結    構    定    義
*********************************************************************************************************/
typedef struct
{
  u8 Buffer[ 255 ] ;
  u8 Len ;
}Communication_Data;
extern Communication_Data RS485_Data;
/*********************************************************************************************************
                    函    數    列    表
*********************************************************************************************************/
void RS485_Init( u32 pclk1,u32 bound ) ;                                //RS485初始化
void RS485_Send_Data( u8 *buf, u8 len ) ;                                //發送n個字節
void RS485_Receive_Data( u8 *buf, u8 *len ) ;                              //接收n個字節


#endif

(2)創建rs485.c文件,輸入以下代碼。

#include "rs485.h"
#include "delay.h"


Communication_Data RS485_Data;
/***************************************************
Name    :USART2_IRQHandler
Function  :串口2中斷服務函數
Paramater  :None
Return    :None
***************************************************/
void USART2_IRQHandler()
{
  //接收到數據
  if( USART2->SR&( 1<<5 ) )
  {
    RS485_Data.Buffer[ RS485_Data.Len ] = USART2->DR ;                        //記錄接收到的值
    RS485_Data.Len ++ ;                                        //接收數據增加1
  }
}
/***************************************************
Name    :RS485_Send_Data
Function  :接收n個字節
Paramater  :
      *buf:接收區首地址
      len:讀取的字節數
Return    :None
***************************************************/
void RS485_Receive_Data( u8 *buf, u8 *len )
{
  u8 i, rxlen=RS485_Data.Len ;
  delay_ms( 10 ) ;                                          //連續超過10ms沒有接收到一個數據,則認為接收結束
  //接收到了數據,且接收完成了
  if( ( rxlen==RS485_Data.Len )&&( rxlen!=0 ) )
  {
    for( i=0; iSR&0x40 )==0 ) ;//等待發送結束
    USART2->DR = buf[ t ] ;
  }   
  while( ( USART2->SR&0x40 )==0 ) ;                                  //等待發送結束  
  RS485_Data.Len = 0 ;
  RS485_EN = 0 ;                                            //設置為接收模式
}
/***************************************************
Name    :RS485_Init
Function  :RS485初始化
Paramater  :
      pclk1:PCLK1時鐘頻率
      bound:波特率
Return    :None
***************************************************/
void RS485_Init( u32 pclk1, u32 bound )
{
  float temp ;
  u16 mantissa, fraction ;
  temp = ( float )( pclk1*1000000 )/( bound*16 ) ;                          //得到USARTDIV
  mantissa = temp ;                                          //得到整數部分
  fraction = ( temp-mantissa )*16 ; //得到小數部分   
    mantissa <<= 4 ;
  mantissa += fraction ;
  RCC->APB2ENR |= 1<<5 ;                                        //使能PD口
   GPIOD->CRL &= 0x0FFFFFFF ;
  GPIOD->CRL |= 0x30000000 ;


  RCC->APB2ENR |= 1<<2 ;                                        //使能PA口
  GPIOA->CRL &= 0xFFFF00FF ;                                      //IO狀態設置
  GPIOA->CRL |= 0x00008B00 ;                                      //IO狀態設置
  RCC->APB1ENR |= 1<<17 ;                                        //使能串口時鐘
  RCC->APB1RSTR |= 1<<17 ;                                      //復位串口2
  RCC->APB1RSTR &= ~( 1<<17 ) ;                                    //停止復位
  //波特率設置
   USART2->BRR = mantissa ;                                      //波特率設置
  USART2->CR1 |= 0x200C ;                                        //1位停止,無校驗位
  USART2->CR1 |= 1<<8 ;                                        //PE中斷使能
  USART2->CR1 |= 1<<5 ;                                        //接收緩沖區非空中斷使能
  NVIC_Init( 3, 3, USART2_IRQn, 2 ) ;                                  //組2
  RS485_EN = 0 ;                                            //默認為接收模式
}

(3)創建1.c文件,輸入以下代碼。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "rs485.h"


int main()
{
  u8 len, datatemp[ 10 ] ;
  STM32_Clock_Init( 9 ) ;                                        //STM32時鐘初始化
  SysTick_Init( 72 ) ;                                        //SysTick初始化
  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200
  RS485_Init( 36, 9600 ) ;                                      //初始化RS485
  RS485_Send_Data( "RS485 Test", 10 ) ;                                //發送數據
  while( 1 )
  {
    RS485_Receive_Data( datatemp, &len ) ;
    delay_ms( 10 ) ;
  }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電壓
    +關注

    關注

    45

    文章

    5605

    瀏覽量

    115764
  • 物理層
    +關注

    關注

    1

    文章

    150

    瀏覽量

    34370
  • OSI
    OSI
    +關注

    關注

    0

    文章

    82

    瀏覽量

    15421
收藏 人收藏

    評論

    相關推薦

    #硬聲創作季 #STM32 學STM32-55 485通信實驗-1

    RS485總線
    水管工
    發布于 :2022年11月11日 01:23:44

    #硬聲創作季 #STM32 學STM32-55 485通信實驗-2

    RS485總線
    水管工
    發布于 :2022年11月11日 01:24:04

    #硬聲創作季 #STM32 學STM32-55 485通信實驗-3

    RS485總線
    水管工
    發布于 :2022年11月11日 01:24:31

    36 34_實戰篇:RS485通信實驗(第二講:程序設計) - 第1節

    HDMI通信dac發生器串口通信代碼
    充八萬
    發布于 :2023年08月19日 09:56:02

    36 34_實戰篇:RS485通信實驗(第二講:程序設計) - 第2節

    HDMI通信dac發生器串口通信代碼
    充八萬
    發布于 :2023年08月19日 09:56:52

    36 34_實戰篇:RS485通信實驗(第二講:程序設計) - 第4節

    HDMI通信dac發生器串口通信代碼
    充八萬
    發布于 :2023年08月19日 09:58:32

    36 34_實戰篇:RS485通信實驗(第二講:程序設計) - 第5節

    HDMI通信dac發生器串口通信代碼
    充八萬
    發布于 :2023年08月19日 09:59:22

    36 34_實戰篇:RS485通信實驗(第二講:程序設計) - 第7節

    fpgaled工業控制BRAM
    充八萬
    發布于 :2023年08月19日 10:01:02

    看完485通信之后參考網上最小系統板畫的原理圖有什么錯的地方?

    我自己有一個探索者開發板,看完485通信實驗之后自己畫了一個一個F1的最小系統板。功能:畫的系統板接收到探索者開發板的信息之后可以顯示出接收到的數字。同時還能驅動繼電器。新人不太會,求助下大神,幫忙看下原理圖有什么錯的地方。原理圖.rar (23.13 KB )
    發表于 01-21 03:57

    請問stm32做485通信應該選取哪款電平轉換芯片?

    在網上看到MAX485和SP3485兩款芯片,它們都能實現TTL轉RS485但是前者用的是5V電壓供電,后者用的是3.3V電壓供電,我的stm32板子上大多是3.3V的引出腳只有2個5V引出腳而SP3485模塊在某寶上的價格又比較貴,那我要做
    發表于 02-22 07:47

    如何用STM32的串口6去完成RS485通信實驗

    如何用STM32的串口6去完成RS485通信實驗呢?有哪些步驟?
    發表于 11-16 06:02

    模擬設定時間和RS-485通信實驗

    基礎的電子類資料,電子工程師必備文檔,快來下載學習吧。
    發表于 07-04 15:02 ?11次下載

    關于RS485通信實驗資料下載

    單片機485通信
    發表于 05-13 09:40 ?14次下載
    關于RS<b class='flag-5'>485</b><b class='flag-5'>通信實驗</b>資料下載

    基于STM32F103單片機的RS485通信實驗之硬件

    過TXD發送出去。當單片機要接收數據的時候,控制U3_TEN為低電平,數據通過RXD接收回來。485通信自動收發電路:自動收發電路,就是不用單片機引腳U3_TEN,當數...
    發表于 12-27 18:55 ?7次下載
    基于STM32F103單片機的RS<b class='flag-5'>485</b><b class='flag-5'>通信實驗</b>之硬件

    STM32入門學習筆記之485通信實驗

    485是屬于OSI模型物理層的電氣標準,屬于2線制,半雙工,多點通信標準,485總線采用兩根線路的電壓差來傳遞信號,485兩根線路名稱為A和B,當線路A與線路B的電壓差為+
    的頭像 發表于 02-16 14:30 ?4339次閱讀
    STM32入門學習筆記之<b class='flag-5'>485</b><b class='flag-5'>通信實驗</b>
    主站蜘蛛池模板: 色九| 全日本爽视频在线| 欧美视频精品在线| freesexvideo性2| www福利视频| 一级a爰片久久毛片| 久久六月丁香婷婷婷| 天天舔天天色| 亚洲综合国产一区二区三区| 色多多黄| 在线播放免费| 91视频免费网站| 日韩日韩| 天天搞夜夜操| 免费观看黄网站| 久久综合综合久久| 美女黄18以下禁止观看| 国产在线精品一区免费香蕉| 91在线影视| 亚州1区2区3区4区产品乱码2021 | 色国产在线视频一区| v片视频| 免费h视频网站| 日韩成人午夜| 日日爽视频| 伊人久久精品成人网| 国产欧美亚洲精品| 天天艹天天射| 国产成人精品一区| 国产在线播放你懂的| 欧美性猛| 欧美性一级交视频| 久久精品免费观看| 四虎在线最新永久免费播放| 午夜看看| 主人扒开腿揉捏花蒂调教cfh| 国产专区视频| 91三级在线观看| 久久精品亚洲一级毛片| 中国人黑人xxⅹ性猛| 日本黄色免费电影|