通用接口協議(串口,iic,spi,can,TCP/IP協議)


 UART

UART通信方式:異步串行全雙工通信方式

異步通信:有通信速度要求。

UART通信速度由兩個設備自己決定。

UART通信有一個數據格式。

 

UART通信四要素:波特率、數據位長度、校驗位、停止位。

芯片通信過程中將這四個要素配好,完成了一大半功能。

備注:自己用過的開發版:STM32F407VG

IIC協議:

iic有兩根線:一根時鍾線,一個數據線。

iic有一個起始信號:時鍾線拉高,數據從高電平到低電平,形成iic的起始信號

iic是如何發送數據的:起始信號+設備地址+數據+結束信號

 

7.1 字節格式
發送到 SDA 線上的每個字節必須為 8 位 每次傳輸可以發送的字節數量不受限制 每個字節后必須跟
一個響應位 首先傳輸的是數據的最高位 MSB 見圖 6 
 
如果從機要完成一些其他功能后 例如一個
內部中斷服務程序 才能接收或發送下一個完整的數據字節 可以使時鍾線 SCL 保持低電平迫使主機進入
等待狀態 當從機准備好接收下一個數據字節並釋放時鍾線 SCL 后 數據傳輸繼續
7.2 響應

 

數據線低電平時產生應答,可繼續發送,不然應為高電平,主機產生結束條件

 

 

 

 

 

項目中的iic:HDC2010、DAC5574

HDC2010:它是一個測量環境溫濕度的一個芯片(IC),濕度和溫度數字傳感器

8位的一個寄存器

使用過程如下:

 使用iic進行寄存器的初始化:復位、關閉中斷、啟動測量寄存器

//等待測量完成

//去讀取溫濕度寄存器的數據。 

 

void HDC2010Init(void)
{
    HDC2010WriteReg(HDC2010_RESET_DRDY_INT_CONF,SOFT_RES_NORMAL|ODR_1_120HZ|HEAT_EN_OFF|DRDY_OR_INT_EN_HIGH_Z);
    //正常復位、1/120輸出速度、DRDY/INT_EN 引腳輸出為高阻,不中斷
    HDC2010WriteReg(HDC2010_INTERRUPT_MASK,DRDY_MASK_DISABLE|TH_MASK_DISABLE|TL_MASK_DISABLE|HH_MASK_DISABLE|HL_MASK_DISABLE);
    //中斷掩碼寄存器設置,所有中斷關
    
    HDC2010WriteReg(HDC2010_MEASUREMENT_CONF,TEM_RES_14BIT|HUM_RES_14BIT|MEAS_CONF_TEM_HUM|MEAS_TRIG_START);
    //測量寄存器設置,溫度14bit,溫濕度均使用、並且啟動測量
    
    
}

 

 

void HDC2010Read(void)
{
	unsigned short temperture=0;
	unsigned short humidity=0;
	float temperture_temp=0; 	
	float humidity_temp=0; 
	while(HDC2010ReadReg(HDC2010_INTERRUPT_DRDY)&DRDY_START_READAY!=DRDY_START_READAY);
	//等待測量完成
	temperture=HDC2010ReadRegU16(HDC201_TEMPERATURE_LOW);
	humidity=HDC2010ReadRegU16(HDC201_HUMIDITY_LOW);
	//printf("temperture=%d\n",temperture);
	//printf("humidity=%d\n",humidity);
	temperture_temp=(float)(((float)temperture)*165/65536) - 40;
	humidity_temp=(float)(((float)humidity)*165/65536);
	if(temperture_temp<0)
	printf("00");
	else
	printf("%.2d",(int)temperture_temp);
	//printf("%d\n",(int)humidity_temp);
}

DAC5574

是一個模擬電壓輸出的芯片。作用是,作為lsu(激光掃描單元)的參考電壓

原理圖:在產品的作用:作為lsu(激光掃描單元)的參考電壓

//通過iic往DAC寫數據,測模擬電壓
//有四路,一路一路的寫,關掉就寫0
unsigned char Write_DAC(unsigned char wdata,unsigned char ctl)
{
	if(!Start()){
		Stop();
		return 10;//FAILURE
		}
	SendByte(0x98);
	if(!WaitAck()){
		Stop();
		return 20;//FAILURE
		}
	SendByte(ctl);
	if(!WaitAck()){
		Stop();
		return 21;//FAILURE
		}
	SendByte(wdata);
	if(!WaitAck()){
		Stop();
		return 22;//FAILURE
		}
	SendByte(0);
	if(!WaitAck()){
		Stop();
		return 23;//FAILURE
		}
	Stop();
	return 1;
}

  

SPI通信協議(SPI總線)學習

SPI是串行外設接口(Serial Peripheral Interface)的縮寫。是 Motorola 公司推出的一
種同步串行接口技術,是一種高速的,全雙工,同步的通信總線。

 支持全雙工通信

通信簡單
數據傳輸速率塊
沒有指定的流控制,沒有應答機制確認是否接收到數據,

所以跟IIC總線協議比較在數據可靠性上有一定的缺陷

它們是SDI(數據輸入)、SDO(數據輸出)、SCLK(時鍾)、CS(片選)。

2):需要說明的是,我們SPI通信有4種不同的模式,不同的從設備可能在出廠是就是配
置為某種模式,這是不能改變的;但我們的通信雙方必須是工作在同一模式下。

所以有效狀態就是SCLK處於高電平時

所以有效狀態就是SCLK處於低電平時

表示數據采樣是在第1個邊沿,數據發送在第2個邊沿

表示數據采樣是在第2個邊沿,數據發送在第1個邊沿

 

需要注意的是:我們的主設備能夠控制時鍾,因為我們的SPI通信並不像UART或者IIC通信
那樣有專門的通信周期,有專門的通信起始信號,有專門的通信結束信號;所以我們的
SPI協議能夠通過控制時鍾信號線,當沒有數據交流的時候我們的時鍾線要么是
保持高電平要么是保持低電平。

 項目中的spi:ht82v38

 是一個16比特的 模擬前端處理器

16-Bit CCD/CIS Analog Signal Processor

 

 

void WriteADC(int addr,int data)
{
	int i;
	addr = addr<<12;
	data = data + addr;
	//data = 0;
	SLOAD_L;
	for(i=0;i<16;i++){
		if(data&0x8000){
			SDATA_H;
		}
		else{
			SDATA_L;
		}
		data = data <<1;
		udelay(4);
		SCLK_H;		
		udelay(4);
		SCLK_L; 	
		}
	SLOAD_H;	
}

int ReadADC(int addr)
{
	int i ,data;
	addr = addr<<12;
	addr = addr + 0x8000;
	data = 0;
	SLOAD_L;
	for(i=0;i<7;i++){
		if(addr & 0x8000){			
		SDATA_H;		
		}
		else{
		SDATA_L;		
		}
		addr = addr <<1;
		udelay(2);
		SCLK_H;		
		udelay(2);
		SCLK_L;
	}
	for(i=7;i<16;i++){			
		data = data <<1;	
		udelay(2);
		if(GPIO_MFP_1_read(10)){
		data = data + 1;		
		}
		SCLK_H;		
		udelay(2);
		SCLK_L;
	}		
	SLOAD_H;
	return data;
}	

  以前做的項目補充。

CAN協議:

現在,CAN 的高性能和可靠性已被認同,並被廣泛地應用於工業自動化、船舶、醫療設備、工業設備等方面。

 CAN-bus 主要特性 

1) 多主控制。
 在總線空閑時,所有的單元都可以開始發送消息(多主控制)。
 最先訪問總線的單元可獲得發送權。
 多個單元同時發送時,發送高優先級 ID 消息的單元可獲得發送權。

2) 消息的發送

在 CAN 協議中,所有的消息都以固定的格式發送。總線空閑時,所有與總線相連的單元都可以
開始發送新的消息。兩個以上的單元同時發送消息是,根據標示符(Identifier 以下稱 ID)決定
優先級。ID 並不是發送的目的地址,而是表示訪問總線的消息的優先級。

兩個以上的單元同時
開始發送消息時,對各消息 ID 的每個位進行逐個仲裁。仲裁獲勝(被判定為高優先級)的單元
可繼續發送消息,仲裁失利的單元則立刻停止發送而轉為接收模式。

4) 通信速度
 根據網絡的規模,可設置合適的通信速度。在同一網絡中,所有單元必須設置統一的通信速度

1.6 CAN 總線物理層的定義
CAN 協議經 ISO 標准后,有 ISO11898 標准和 ISO11519-2 標准兩種。ISO11898 標准和 ISO11519-2 標准
對數據鏈路層定義相同,但對物理層定義不同。如圖 1.4。
1) 關於 ISO11898
 ISO11898 是通信速度為 125kbps~1Mbps 的 CAN 高速通信標准。
2) 關於 ISO11519
 ISO11519 是通信速度 為 125kbps 以下的的 CAN 低速通信標准。
8. CAN 總線協議
8.1 幀的種類
通信是通過以下 5 種類型的幀進行的。
• 數據幀
• 遙控幀
• 錯誤幀
• 過載幀
• 幀間隔  
另外,數據幀和遙控幀有標准格式和擴展格式兩種格式。標准格式有 11 個位的標識符(Identifier: 以下稱 ID),
擴展格式有 29 個位的 ID。
各種幀的用途如表 7 所示,各種幀的構成如圖 11~圖 15 所示。
表 7. 幀的種類及用途
幀            幀用途
數據幀   用於發送單元向接收單元傳送數據的幀。
遙控幀   用於接收單元向具有相同 ID 的發送單元請求數據的幀。
錯誤幀   用於當檢測出錯誤時向其它單元通知錯誤的幀。
過載幀   用於接收單元通知其尚未做好接收准備的幀。
幀間隔   用於將數據幀及遙控幀與前面的幀分離開來的幀。

 

 

8.2 數據幀
數據幀由 7 個段構成。
數據幀的構成如圖 16 所示。
(1) 幀起始
表示數據幀開始的段。
(2) 仲裁段
表示該幀優先級的段。
(3) 控制段
表示數據的字節數及保留位的段。
(4) 數據段
數據的內容,可發送 0~8 個字節的數據。
(5) CRC 段
檢查幀的傳輸錯誤的段。
(6) ACK 段
表示確認正常接收的段。
(7) 幀結束
表示數據幀結束的段。
下面對幀的構成進行說明。

 

 項目中用到的CAN。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM