UART
UART通信方式:異步串行全雙工通信方式
異步通信:有通信速度要求。
UART通信速度由兩個設備自己決定。
UART通信有一個數據格式。
UART通信四要素:波特率、數據位長度、校驗位、停止位。
芯片通信過程中將這四個要素配好,完成了一大半功能。
備注:自己用過的開發版:STM32F407VG
IIC協議:
iic有兩根線:一根時鍾線,一個數據線。
iic有一個起始信號:時鍾線拉高,數據從高電平到低電平,形成iic的起始信號
iic是如何發送數據的:起始信號+設備地址+數據+結束信號

項目中的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比特的 模擬前端處理器

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 的高性能和可靠性已被認同,並被廣泛地應用於工業自動化、船舶、醫療設備、工業設備等方面。
1) 多主控制。
在總線空閑時,所有的單元都可以開始發送消息(多主控制)。
最先訪問總線的單元可獲得發送權。
多個單元同時發送時,發送高優先級 ID 消息的單元可獲得發送權。
2) 消息的發送
在 CAN 協議中,所有的消息都以固定的格式發送。總線空閑時,所有與總線相連的單元都可以
開始發送新的消息。兩個以上的單元同時發送消息是,根據標示符(Identifier 以下稱 ID)決定
優先級。ID 並不是發送的目的地址,而是表示訪問總線的消息的優先級。
兩個以上的單元同時
開始發送消息時,對各消息 ID 的每個位進行逐個仲裁。仲裁獲勝(被判定為高優先級)的單元
可繼續發送消息,仲裁失利的單元則立刻停止發送而轉為接收模式。
4) 通信速度
根據網絡的規模,可設置合適的通信速度。在同一網絡中,所有單元必須設置統一的通信速度


項目中用到的CAN。