?1. I2C接口
——概述:I2C是一個(gè)兩線接口,一條數(shù)據(jù)線癞季、一條時(shí)鐘線劫瞳,采用邊沿觸發(fā)方式。使用方式為cpu<——>device
——從設(shè)備:系統(tǒng)中所有外圍器件都有一個(gè)7位的地址碼绷柒,高四位為器件類型志于,由生產(chǎn)廠家制定,低三位為器件引腳定義地址废睦,由使用者定義伺绽。主控制器通過(guò)地址碼建立多機(jī)通信的機(jī)制,終端掛載在總線上郊楣,有主端和從端之分憔恳,主端必須是帶有cpu的邏輯模塊,在同一總線上的同一時(shí)刻只能有一個(gè)主端净蚤,可以有多個(gè)從端钥组。
——速率:
? ? 普通模式:100khz ?| ?? ??快速模式:400khz ? ?|?? ??高速模式:3.4Mhz
——協(xié)議:
1. 空閑狀態(tài):
I2C總線的SDA和SCL兩條信號(hào)線同時(shí)處于高電平時(shí),規(guī)定為總線的空閑狀態(tài)今瀑。此時(shí)各個(gè)器件的輸出場(chǎng)效應(yīng)管處于截止?fàn)顟B(tài)程梦,即釋放總線点把,由兩條信號(hào)線各自的上拉電阻把電平拉高。
2. 起始位和停止位的定義:
起始信號(hào):當(dāng)SCL為高期間屿附,SDA由高到低的跳變郎逃,啟動(dòng)信號(hào)是一種電平跳變時(shí)序信號(hào),而不是一個(gè)電平信號(hào)挺份。
停止信號(hào):當(dāng)SCL為高期間褒翰,SDA由低到高的跳變,停止信號(hào)是一種電平跳變時(shí)序信號(hào)匀泊,而不是一個(gè)電平信號(hào)优训。
發(fā)送器每發(fā)送一個(gè)字節(jié),就在時(shí)鐘脈沖9期間釋放數(shù)據(jù)線各聘,由接收器反饋一個(gè)應(yīng)答信號(hào)揣非。應(yīng)答信號(hào)為低電平時(shí),規(guī)定為有效應(yīng)答位(ACK簡(jiǎn)稱應(yīng)答位)躲因,表示接收器已經(jīng)成功地接收了改字節(jié)早敬;應(yīng)答信號(hào)為高電平時(shí),規(guī)定為非應(yīng)答位(NACK)大脉,一般表示接收器接收該字節(jié)沒(méi)有成功搞监。對(duì)于反饋有效應(yīng)答位ACK的要求是,接收器在第9個(gè)時(shí)鐘脈沖之前的低電平期間將SDA線拉低箱靴,并且確保在該時(shí)鐘的高電平期間為穩(wěn)定的低電平腺逛。如果接收器是主控器,則在它收到最后一個(gè)字節(jié)后衡怀,發(fā)送一個(gè)NACK信號(hào),以通知被控發(fā)送器結(jié)束數(shù)據(jù)發(fā)送安疗,并釋放SDA線抛杨,以便主控接收器發(fā)送一個(gè)停止信號(hào)P。
——數(shù)據(jù)的有效性:
I2C總線進(jìn)行數(shù)據(jù)傳送時(shí)荐类,時(shí)鐘信號(hào)為高電平期間怖现,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間玉罐,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化屈嗤。
寫(xiě)一個(gè)字節(jié)
void write_byte(uchar date)//寫(xiě)一個(gè)字節(jié)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++){
????????temp=temp<<1;
????????scl=0;
????????//拉低SCL,因?yàn)橹挥性跁r(shí)鐘信號(hào)為低電平期間按數(shù)據(jù)線上的高低電平狀態(tài)下才允許變化吊输,并在此時(shí)和上一個(gè)循環(huán)的scl=1一起形成一個(gè)上升沿
????????delay();
????????sda=CY;
????????delay();
? ? ? ??scl=1;//拉高SCL饶号,此時(shí)SDA上的數(shù)據(jù)穩(wěn)定
????????delay();
}
scl=0;//拉低SCL,為下次數(shù)據(jù)傳輸做好準(zhǔn)備
delay();
sda=1;//釋放SDA總線季蚂,接下來(lái)由從設(shè)備控制茫船,比如從設(shè)備接收完數(shù)據(jù)后琅束,在SCL為高時(shí),拉低SDA作為應(yīng)答信號(hào)
delay();
}
uchar read_byte()//讀一個(gè)字節(jié)
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++){
????????scl=1;//上升沿時(shí)算谈,IIC設(shè)備將數(shù)據(jù)放在sda線上涩禀,并在高電平期間數(shù)據(jù)已經(jīng)穩(wěn)定,可以接收
????????delay();
????????k=(k<<1)|sda;
????????scl=0;//拉低SCL
????????delay();
}
return k;
}
寫(xiě)一個(gè)字節(jié)的流程
void write_add(uchar address,uchar data)//任意寫(xiě)一個(gè)字節(jié)
{
????????start();//啟動(dòng)——在SCL為高電平期間然眼,SDA一個(gè)下降沿觸發(fā)艾船,開(kāi)始發(fā)送
????????write_byte(0xa0);// 發(fā)送從設(shè)備地址 0x0a,寫(xiě)操作0x00
????????respons();//等待從設(shè)備響應(yīng)
????????write_byte(address);//發(fā)出芯片內(nèi)的寄存器地址高每,示意要給此寄存器賦值
????????respons();
????????write_byte(data); ?????//寫(xiě)寄存器
????????respons();
????????stop(); ? // _停止信號(hào)丽声,SCL在高電平期間,SDA一個(gè)上升沿觸發(fā)觉义,結(jié)束發(fā)送雁社。
}
讀取一個(gè)字節(jié)
uchar read_add(uchar address)//讀取一個(gè)字節(jié)
{
????????uchar data;
????????start();//啟動(dòng)——在SCL為高電平期間,SDA一個(gè)下降沿觸發(fā)晒骇,開(kāi)始發(fā)送
????????write_byte(0xa0);//發(fā)送從設(shè)備地址霉撵,寫(xiě)操作,片選
????????respons();//等待從設(shè)備響應(yīng)
????????write_byte(address);//發(fā)送芯片內(nèi)地址洪囤,告知要讀寫(xiě)的寄存器
????????respons();
????????start();
????????write_byte(0xa1);//發(fā)送從設(shè)備地址 讀操作
????????respons();
????????data=read_byte();//獲取數(shù)據(jù)
????????stop();
????????return data;
}
I2C的讀寫(xiě)流程:
寫(xiě)寄存器的標(biāo)準(zhǔn)流程為:
1.??? Master發(fā)起START
2.??? Master發(fā)送I2C addr(7bit)和w操作0(1bit)徒坡,等待ACK
3.??? Slave發(fā)送ACK
4.??? Master發(fā)送reg addr(8bit),等待ACK
5.??? Slave發(fā)送ACK
6.??? Master發(fā)送data(8bit)瘤缩,即要寫(xiě)入寄存器中的數(shù)據(jù)喇完,等待ACK
7.??? Slave發(fā)送ACK
8.??? 第6步和第7步可以重復(fù)多次,即順序?qū)懚鄠€(gè)寄存器
9.??? Master發(fā)起STOP
讀寄存器的標(biāo)準(zhǔn)流程為:
1.??? Master發(fā)送I2C addr(7bit)和w操作1(1bit)剥啤,等待ACK
2.??? Slave發(fā)送ACK
3.??? Master發(fā)送reg addr(8bit)锦溪,等待ACK
4.??? Slave發(fā)送ACK
5.??? Master發(fā)起START
6.??? Master發(fā)送I2C addr(7bit)和r操作1(1bit),等待ACK
7.??? Slave發(fā)送ACK
8.??? Slave發(fā)送data(8bit)府怯,即寄存器里的值
9.??? Master發(fā)送ACK
10.??? 第8步和第9步可以重復(fù)多次刻诊,即順序讀多個(gè)寄存器
2. uart接口
UART ?:通用異步串口,只有三根線牺丙、發(fā)送则涯、接收、地線冲簿。由于不是靠時(shí)鐘進(jìn)行傳輸粟判,所以不是同步傳輸。本質(zhì)原理是采樣峦剔。
電平 ? ? :使用標(biāo)準(zhǔn)的TTL/CMOS電平信號(hào)档礁。為增強(qiáng)抗干擾能力,提高傳輸長(zhǎng)度羊异,常采用RS232電平(3~12 表示0)(-3~-12表示1)
傳輸速率:傳輸速率取決于串口時(shí)鐘事秀,和采樣率彤断。一般為16倍采樣。
傳輸格式:一次發(fā)送一幀易迹,由具有完整意義的宰衙,不可分割的若干位組成。開(kāi)始位睹欲、數(shù)據(jù)位供炼、校驗(yàn)位(可選)、停止位窘疮。
RS232袋哼、RS422、RS485
RS422/485采用差分傳輸?shù)姆绞秸⑸溃卜Q作平衡傳輸涛贯,使用雙絞線,最大的傳輸距離為1200米蔚出,最大的傳輸速率為10Mb/s弟翘。
通信距離:
RS232? ? :波特率9600建議在13米以內(nèi)
RS422/485: 波特率9600建議在1200米以內(nèi)。
RS-485采用平衡發(fā)送和差分接收骄酗,因此具有抑制共模干擾的能力稀余,總線收發(fā)器具備的靈敏度也比較高,能檢測(cè)低至200mv的電壓趋翻,故傳輸信號(hào)能在千米以外得到恢復(fù)睛琳。RS485采用半雙工的工作方式,任何時(shí)候只能有一點(diǎn)處于發(fā)送狀態(tài)踏烙,因此發(fā)送電路需由使能信號(hào)加以控制师骗。其在多點(diǎn)互連時(shí)非常方便,可以省掉很多信號(hào)線宙帝。
總線RS422和RS485 ?的電路原理基本相同丧凤,都是以差動(dòng)的方式發(fā)送和接收,不需要數(shù)字地線步脓。差分是傳輸近距離遠(yuǎn)的根本原因,這是和RS232的根本區(qū)別浩螺。RS422通過(guò)兩對(duì)雙絞線可以全雙工工作收發(fā)互不影響靴患,RS485只能半雙工工作,發(fā)收不能同時(shí)進(jìn)行要出。
在RS232或RS485設(shè)備聯(lián)成的設(shè)備網(wǎng)中鸳君,如果設(shè)備數(shù)量超過(guò)2臺(tái),就必須使用RS485做通訊介質(zhì)患蹂,RS485網(wǎng)的設(shè)備間要想互通信息只有通過(guò)“主(Master)”設(shè)備中轉(zhuǎn)才能實(shí)現(xiàn)或颊,這個(gè)主設(shè)備通常是PC砸紊,而這種設(shè)備網(wǎng)中只允許存在一個(gè)主設(shè)備,其余全部是從(Slave)設(shè)備囱挑。而現(xiàn)場(chǎng)總線技術(shù)是以ISO/OSI模型為基礎(chǔ)的醉顽,具有完整的軟件支持系統(tǒng),能夠解決總線控制平挑、沖突檢測(cè)游添、鏈路維護(hù)等問(wèn)題。現(xiàn)場(chǎng)總線設(shè)備自動(dòng)成網(wǎng)通熄,無(wú)主/從設(shè)備之分或允許多主存在唆涝。在同一個(gè)層次上不同廠家的產(chǎn)品可以互換,設(shè)備之間具有互操作性唇辨。
3. USART
USART是增加了時(shí)鐘線的UART廊酣。
USART編程的一些注意事項(xiàng):
uint32_t?USART_BaudRate; ? ? ? ? ? ? ? ? ? //?波特率
uint32_t?USART_WordLength; ?????????????/ /?字長(zhǎng)
uint32_t?USART_StopBits; ???????????????????//?停止位
uint32_t?USART_Parity; ? ? ? ? ? ? ? ? ? ? ? ?//?校驗(yàn)位
uint32_t?USART_Mode; ? ? ? ? ? ? ? ? ? ? ? ?// USART模式
uint32_t?OverSampling; //?過(guò)采樣設(shè)置,8倍或者16倍
uint32_t?CLKPolarity; //時(shí)鐘極性
uint32_t?CLKPhase; //時(shí)鐘相位
uint32_t?CLKLastBit; //最尾位時(shí)鐘脈沖
USART_LastBit:選擇在發(fā)送最后一個(gè)數(shù)據(jù)位的時(shí)候時(shí)鐘脈沖是否在SCLK引腳輸出赏枚,可以是不輸出脈沖(USART_LastBit_Disable)亡驰、輸出脈沖(USART_LastBit_Enable)。它設(shè)定USART_CR2寄存器的LBCL位的值嗡贺。
4. spi接口
SPI接口總結(jié) - Loadingzc的專欄 - CSDN博客
第24章 SPI—讀寫(xiě)串行FLASH—零死角玩轉(zhuǎn)STM32-F429系列 - 野火_firege - 博客園
SPI信號(hào)線:
——SPI包含四條總線隐解,分別為SS占锯、SCK檬洞、MOSI、MISO
——SS:片選噩茄,低電平有效摄凡,有多少?gòu)脑O(shè)備就有多少片選信號(hào)線续徽,沒(méi)有從設(shè)備地址。
——SCK:時(shí)鐘線亲澡,由主通信設(shè)備產(chǎn)生钦扭,不同的設(shè)備支持的時(shí)鐘頻率不一樣,時(shí)鐘決定了通信速率床绪。
——MOSI:主設(shè)備輸出客情、從設(shè)備輸入
——MISO:主設(shè)備輸出、從設(shè)備輸入
SPI模式:
根據(jù)SPI時(shí)鐘極性 CPOL和時(shí)鐘香味CPHA配置的不同癞己,分為四種工作模式膀斋。
時(shí)鐘極性:SPI空閑狀態(tài)時(shí),SCK的信號(hào)電平痹雅。SPOL=0, SCK在空閑狀態(tài)時(shí)為低電平仰担,CPOL=1時(shí)相反。
時(shí)鐘相位:數(shù)據(jù)采樣的時(shí)刻绩社,當(dāng)CPHA=0時(shí)摔蓝,MOSI或MISO數(shù)據(jù)線上的信號(hào)將會(huì)在SCK時(shí)鐘線的奇數(shù)邊沿被采樣赂苗。當(dāng)CPHA=1時(shí),在偶數(shù)邊沿采樣贮尉。
SPI特性及架構(gòu)
(1)單次傳輸可選擇為 8 或 16 位拌滋。
(2)波特率預(yù)分頻系數(shù)(最大為 fPCLK/2) 。
(3)時(shí)鐘極性(CPOL)和相位(CPHA)可編程設(shè)置 绘盟。
(4)數(shù)據(jù)順序的傳輸順序可進(jìn)行編程選擇鸠真,MSB 在前或 LSB 在前。
(5)可觸發(fā)中斷的專用發(fā)送和接收標(biāo)志龄毡。
(6)可以使用 DMA 進(jìn)行數(shù)據(jù)傳輸操作吠卷。
在SPI編程中需要注意的點(diǎn):
_設(shè)置SPI的單雙向模式——單工模式還是全雙工程序
_設(shè)置SPI的主/從端模式——最大的區(qū)別在于SPI的SCK信號(hào)線的時(shí)序,時(shí)序是由主機(jī)產(chǎn)生的
_設(shè)置SPI的數(shù)據(jù)幀長(zhǎng)度沦零,8位還是16位——需要根據(jù)從芯片的datasheet而定
_設(shè)置時(shí)鐘極性祭隔,CPOL,可選高低電平(空閑時(shí)候的時(shí)鐘狀態(tài))——空閑時(shí)的時(shí)鐘極性
_設(shè)置時(shí)鐘相位路操,可選 奇/偶數(shù)邊沿采樣——采樣時(shí)的相位
_設(shè)置NSS引腳由SPI硬件控制還是軟件控制——實(shí)際中軟件控制較多
_設(shè)置時(shí)鐘分頻因子疾渴,fpclk/分頻數(shù) = fsck
_設(shè)置MSB/LSB先行
_設(shè)置CRC校驗(yàn)的表達(dá)式