一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在嵌入式系統(tǒng)中,主控MCU集成多種片上外設(shè)設(shè)計(jì)

AGk5_ZLG_zhiyua ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-05-25 09:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)中,主控MCU往往集成了多種片上外設(shè),例如,GPIO、PWM、I2C、SPI、UART、ADC等等。通過(guò)它們可以使MCU輕松的與“外部世界”相互連接、相互通信,從而與“外部世界”交互。在AWorks中,對(duì)這些外設(shè)進(jìn)行了抽象,為同一類(lèi)外設(shè)提供了相同的使用接口。對(duì)于用戶(hù)來(lái)講,無(wú)論使用什么MCU,只要該MCU具有相應(yīng)的外設(shè),則均可以使用相同的外設(shè)接口進(jìn)行操作,因而使用某一外設(shè)的應(yīng)用程序可以輕松的跨平臺(tái)(移到另外一個(gè)硬件平臺(tái))復(fù)用。同時(shí),由于直接為用戶(hù)提供了外設(shè)的使用接口,因此,用戶(hù)不再需要了解底層的寄存器操作,由此可以將用戶(hù)從閱讀寄存器手冊(cè)、編寫(xiě)底層驅(qū)動(dòng)中解脫出來(lái),使用戶(hù)更加專(zhuān)注于產(chǎn)品本身的“核心域”,提升產(chǎn)品的競(jìng)爭(zhēng)力。

7.1 GPIO

在使用一個(gè)I/O口前,必須正確的配置I/O的功能和模式。同時(shí),由于一個(gè)I/O口往往可用于多種功能,但同一時(shí)刻只能用于某一確定的功能,為了避免沖突,在將一個(gè)引腳用作某一功能前,應(yīng)該向系統(tǒng)申請(qǐng),使用完畢后再釋放。

當(dāng)將I/O口用作GPIO(General Purpose Input Output)功能時(shí),GPIO作為一種通用輸入/輸出接口,有兩種常用的使用方式:一種是用作普通的輸入/輸出接口;一種是用作中斷輸入接口,即當(dāng)指定的輸入狀態(tài)事件發(fā)生(比如:下降沿)時(shí),觸發(fā)用戶(hù)自定義回調(diào)函數(shù)。

7.1.1 I/O配置

通常情況下,一個(gè)引腳往往可以用作多種功能,例如,在i.MX280中,PIO3_0可以用作下面4種功能:

  • 應(yīng)用串口0的接收引腳;

  • I2C0的時(shí)鐘引腳;

  • 調(diào)試串口的CTS引腳;

  • 通用GPIO。

同時(shí),GPIO往往還具有多種模式,比如:上拉、下拉、開(kāi)漏、推挽等。為了正確使用一個(gè)IO口,必須先將其配置為正確的功能和模式。AWorks提供了I/O配置接口,其原型為:

其中,pin為引腳編號(hào),flags為配置的功能和模式標(biāo)志,返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示配置成功,否則,表示配置失敗,配置失敗可能是由于部分功能和模式不支持造成的。

引腳編號(hào)pin用于指定需要配置的引腳,在GPIO標(biāo)準(zhǔn)接口層中,所有函數(shù)的第一個(gè)參數(shù)均為pin,用于指定具體操作的引腳,具體的引腳編號(hào)在{chip}_pin.h文件中定義(chip代表芯片名,例如,對(duì)于i.mx28x系列MCU,chip即為imx28x,對(duì)應(yīng)文件名為imx28x_pin.h),宏名的格式為PIOx_y,比如:PIO3_0。

flags為配置標(biāo)志,由“通用功能|通用模式|平臺(tái)功能|平臺(tái)模式”(‘|’就是C語(yǔ)言的按位或)組成。

1. 通用功能和模式

通用功能和模式是AWorks抽象的GPIO最通用的功能和模式,它們?cè)赼w_gpio.h文件中使用宏的形式進(jìn)行了定義,宏名格式為AW_GPIO_*。通用功能相關(guān)宏定義與含義詳見(jiàn)表7.1,通用模式相關(guān)宏定義與含義詳見(jiàn)表7.2。

表7.1 引腳通用功能

表7.2 引腳通用模式

通用功能和模式相關(guān)的宏定義在標(biāo)準(zhǔn)接口層中,不會(huì)隨芯片的改變而改變,使用通用功能和模式的應(yīng)用程序是與具體芯片是無(wú)關(guān)的,可以跨平臺(tái)復(fù)用。使用通用功能和模式配置引腳的范例程序詳見(jiàn)程序清單7.1。

程序清單7.1 使用通用功能和模式配置引腳的范例程序

2. 平臺(tái)功能和模式

平臺(tái)功能和模式與具體芯片相關(guān),會(huì)隨著芯片的不同而不同,主要包括引腳的復(fù)用功能和一些特殊的模式,平臺(tái)功能和模式相關(guān)的宏定義在{chip}_pin.h文件中,宏名的格式為PIOx_y_*,比如:PIO3_0_AUART0_RX,即PIO3_0的串口0接收引腳。

如需查找某一引腳(比如:PIO3_0)相關(guān)的平臺(tái)功能和平臺(tái)模式,可以打開(kāi){chip}_pin.h文件,找到以PIO或引腳編號(hào)PIO3_0為前綴的所有宏定義。若一個(gè)宏定義以引腳編號(hào)為前綴,則表明該宏僅可用于引腳編號(hào)對(duì)應(yīng)的引腳,例如,PIO3_0_AUART0_RX僅可用于PIO3_0。若一個(gè)宏定義沒(méi)有以具體引腳編號(hào)為前綴,僅以PIO作為前綴,則表明該宏對(duì)應(yīng)的功能或模式可用于所有引腳。例如,PIO3_0相關(guān)的平臺(tái)功能詳見(jiàn)表7.4,相關(guān)的平臺(tái)模式定義詳見(jiàn)表7.3。

表7.3 引腳平臺(tái)模式

表7.4 PIO3_0平臺(tái)功能

在表7.3中,所有平臺(tái)模式都以PIO作為前綴,而非PIO3_0作為前綴。表明這些平臺(tái)模式不是PIO3_0引腳所特有的,而是所有引腳都可能支持的模式,即這些模式對(duì)應(yīng)的宏可以在配置任意引腳時(shí)使用。使用平臺(tái)功能和模式配置引腳的范例程序詳見(jiàn)程序清單7.2。

程序清單7.2 使用通用功能和模式配置引腳的范例程序

特別地,平臺(tái)功能和模式可以和通用功能和模式組合使用。例如,在配置I2C引腳時(shí),可以開(kāi)啟內(nèi)部上拉,范例程序詳見(jiàn)程序清單7.3。

程序清單7.3 通用模式和平臺(tái)模式混合使用

7.1.2 I/O的申請(qǐng)和釋放

如表7.4所示,PIO3_0可以被用作4種功能。雖然PIO3_0的功能眾多,但是,在同一時(shí)刻,其只能被用作某一確定功能,并不能同時(shí)使用多種功能。

隨著系統(tǒng)復(fù)雜度的上升,用戶(hù)往往很難保證某一引腳只被用作一種功能,稍有不慎,就可能將某一引腳同時(shí)配置為多種功能,而實(shí)際上,由于引腳同一時(shí)刻只能被用作一種功能,因此,部分使用某種功能的程序?qū)⒉荒苷9ぷ?。這種情況下,用戶(hù)往往很難發(fā)現(xiàn)工作異常的原因。

例如,PIO3_0已經(jīng)被用作I2C0的時(shí)鐘引腳,結(jié)果由于程序員的不小心,又將其配置為串口0的接收引腳,此時(shí),若不加以保護(hù),則引腳會(huì)被配置為串口0的接收引腳,這將導(dǎo)致I2C0工作不正常。

為了保證引腳功能的互斥使用,AWorks提供了一種申請(qǐng)機(jī)制,在將引腳用作某一功能前,必須向系統(tǒng)申請(qǐng),若該引腳處于空閑狀態(tài),還未被申請(qǐng)過(guò),則本次申請(qǐng)成功,同時(shí)標(biāo)記該引腳已被使用。若在申請(qǐng)時(shí),該引腳已被申請(qǐng),則本次申請(qǐng)失敗。當(dāng)一個(gè)引腳使用完畢時(shí),應(yīng)該釋放該引腳,以便系統(tǒng)將該引腳分配給下一個(gè)申請(qǐng)者。

在實(shí)際應(yīng)用中,往往在設(shè)計(jì)硬件電路時(shí),一個(gè)引腳只會(huì)被用作某一確定的功能,不會(huì)將一個(gè)引腳同時(shí)用作多個(gè)外設(shè)功能引腳,因此,軟件設(shè)計(jì)正確無(wú)誤的情況下,通常不會(huì)出現(xiàn)申請(qǐng)失敗的情況。當(dāng)申請(qǐng)失敗時(shí),往往是由于軟件開(kāi)發(fā)人員的錯(cuò)誤導(dǎo)致的,這就需要軟件開(kāi)發(fā)人員引起足夠的重視,出現(xiàn)申請(qǐng)失敗的情況時(shí),必須立即解決,找到某一引腳被非法占用的位置。

引腳申請(qǐng)機(jī)制包括兩個(gè)接口,相關(guān)接口的原型詳見(jiàn)表7.5。

表7.5 引腳申請(qǐng)機(jī)制相關(guān)接口(aw_gpio.h)

1. 申請(qǐng)引腳

當(dāng)需要使用一組引腳時(shí),應(yīng)該向系統(tǒng)申請(qǐng),申請(qǐng)的函數(shù)原型為:

其中,p_name為申請(qǐng)者的名字,p_pins指向引腳列表,num為本次申請(qǐng)的引腳個(gè)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示申請(qǐng)成功,可以正常使用相關(guān)的引腳,否則,表示申請(qǐng)失敗,相關(guān)引腳已經(jīng)被占用,無(wú)法使用。

p_name為申請(qǐng)者的名字,其指向一個(gè)字符串,例如,"LED"、"UART" 、"SSP0"、"I2C0"等,名字僅作標(biāo)記,便于引腳的跟蹤,可以任意設(shè)定。

p_pins為引腳列表,例如,要申請(qǐng)PIO3_2和PIO3_3這兩個(gè)引腳用作串口功能,則引腳列表可以定義為:

num表示本次申請(qǐng)的引腳個(gè)數(shù),其值應(yīng)該與p_pins指向的列表中的引腳個(gè)數(shù)相等,比如:2。申請(qǐng)PIO3_2和PIO3_3這兩個(gè)引腳用作串口功能的范例程序詳見(jiàn)程序清單7.4。

程序清單7.4 引腳申請(qǐng)范例程序

只有當(dāng)引腳申請(qǐng)成功后,才能配置相應(yīng)的引腳用作串口功能。

特別地,即使將一個(gè)IO口用作通用的GPIO口,也需要先申請(qǐng),例如,要將PIO2_6用作通用I/O口,用以控制LED0。則同樣需要在將其配置為通用I/O功能前向系統(tǒng)申請(qǐng),范例程序程序清單7.4。

關(guān)于需要申請(qǐng)引腳的時(shí)機(jī),一個(gè)簡(jiǎn)單的原則就是:在調(diào)用aw_gpio_pin_cfg()前,都應(yīng)該確保已經(jīng)向系統(tǒng)申請(qǐng)到該引腳的使用權(quán)。

2. 釋放引腳

當(dāng)引腳使用完畢,暫時(shí)不再使用時(shí),應(yīng)該釋放引腳,清除每個(gè)引腳的使用記錄。便于其它模塊申請(qǐng)使用。其函數(shù)原型為:

其中, p_pins指向引腳列表,num為本次釋放的引腳個(gè)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示釋放成功,否則,表示釋放失敗,可能是由于參數(shù)錯(cuò)誤導(dǎo)致的。

p_pins為引腳列表,其應(yīng)該與申請(qǐng)引腳時(shí)的引腳列表一致,例如,要釋放之前申請(qǐng)的PIO3_2和PIO3_3這兩個(gè)引腳,則引腳列表定義為:

num表示本次釋放的引腳個(gè)數(shù),其值應(yīng)該與p_pins指向的列表中的引腳個(gè)數(shù)相等,比如:2。釋放PIO3_2和PIO3_3這兩個(gè)引腳的范例程序詳見(jiàn)程序清單7.5。

程序清單7.5 釋放引腳范例程序

在釋放引腳前,可以將I/O口配置為通用GPIO功能,以使其不再作為串口的功能引腳。特別注意,這一配置操作只能在釋放前完成,釋放后將失去引腳的控制權(quán),不可再對(duì)其進(jìn)行配置操作。

7.1.3 普通I/O接口

當(dāng)將一個(gè)引腳配置為通用I/O接口時(shí)(輸入或輸出),則可以通過(guò)相關(guān)的I/O接口控制其輸出狀態(tài)或獲取其輸入狀態(tài)。相關(guān)接口的原型詳見(jiàn)表7.6。

表7.6 GPIO通用接口(aw_gpio.h)

1. 獲取引腳電平

無(wú)論當(dāng)前引腳處于輸出模式還是輸入模式,都可以通過(guò)該接口獲取當(dāng)前的引腳電平狀態(tài)。其函數(shù)原型為:

其中的pin為引腳編號(hào)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),若返回值小于0,則表示獲取失敗,失敗的原因可能是用于引腳不存在。若返回值為非負(fù)數(shù),則表明獲取成功,其值為0時(shí),表明當(dāng)前引腳的電平為低電平,其值大于0時(shí),表明當(dāng)前引腳的電平為高電平。范例程序詳見(jiàn)程序清單7.6。

程序清單7.6 獲取引腳電平范例程序

2. 設(shè)置引腳電平

當(dāng)引腳處于輸出模式時(shí),可以通過(guò)該接口設(shè)置引腳的輸出電平,其函數(shù)原型為:

其中,pin為引腳編號(hào)。value為設(shè)置的值,當(dāng)value為0時(shí),輸出低電平,否則,輸出高電平。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示設(shè)置成功,否則,表示設(shè)置失敗。

例如,可以控制GPIO的輸出電平,達(dá)到控制LED狀態(tài)的目的。在EPC-AW280上板載了一個(gè)運(yùn)行指示燈,標(biāo)識(shí)為RUN,其對(duì)應(yīng)的原理圖詳見(jiàn)圖7.1。

圖7.1 板載LED電路

其中,發(fā)光二極管的陰極與MCU的PIO2_6相連,當(dāng)I/O輸出低電平時(shí),由于LED陽(yáng)極加了3.3V電壓(高電平1),因而形成了電位差,所以有電流流動(dòng),則LED發(fā)光二極管導(dǎo)通,即LED發(fā)光;當(dāng)I/O輸出高電平1時(shí),由于無(wú)法形成電位差,則LED二極管不導(dǎo)通,即LED熄滅。

基于此,可以使PIO2_6輸出低電平,以點(diǎn)亮LED,范例程序詳見(jiàn)程序清單7.7。

程序清單7.7 設(shè)置引腳電平范例程序

程序中,首先將PIO2_6配置為了輸出模式,并將初始值設(shè)定為高電平,以便初始化完畢后,LED默認(rèn)處于熄滅狀態(tài)。

同理,點(diǎn)亮LED后,可以控制PIO2_6輸出高電平,以熄滅LED。如以一定的頻率交替使PIO2_6輸出高電平和低電平,則可以看到LED閃爍,范例程序程序清單7.8。

程序清單7.8 交替輸出高低電平的范例程序

這里通過(guò)GPIO的輸出控制LED,僅為介紹GPIO接口的使用方法。實(shí)際中,AWorks已經(jīng)定義了通用的LED接口,在應(yīng)用中操作LED時(shí),均建議使用通用的LED接口。

3. 翻轉(zhuǎn)引腳電平

該接口用于翻轉(zhuǎn) GPIO 引腳的輸出電平,如果GPIO當(dāng)前輸出的是低電平,當(dāng)調(diào)用該函數(shù)后,GPIO將輸出高電平,反之則輸出變?yōu)榈碗娖?。其函?shù)原型為:

其中,pin為引腳編號(hào)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示翻轉(zhuǎn)成功,否則,表示翻轉(zhuǎn)失敗。在程序清單7.8中,通過(guò)交替輸出高電平和低電平實(shí)現(xiàn)了LED閃爍。而交替輸出高低電平本質(zhì)上就是不斷翻轉(zhuǎn)GPIO的輸出電平。基于此,若以一定的頻率翻轉(zhuǎn)GPIO的輸出電平,同樣可以實(shí)現(xiàn)LED閃爍,范例程序詳見(jiàn)程序清單7.9。

程序清單7.9 翻轉(zhuǎn)引腳電平的范例程序

7.1.4 中斷I/O接口

由對(duì)普通I/O接口的介紹可知,若需獲取某一引腳的狀態(tài),可以通過(guò)aw_gpio_get()接口得到引腳的當(dāng)前輸入狀態(tài)。若用戶(hù)需要監(jiān)控GPIO某一狀態(tài)事件(比如:GPIO由高電平變?yōu)榈碗娖剑串?dāng)出現(xiàn)某一狀態(tài)時(shí),才執(zhí)行相應(yīng)的操作。若還是使用普通I/O接口,則必須不斷的調(diào)用aw_gpio_get()接口,直到讀取到引腳電平為0。顯然,由于使用這種方式需要不斷的輪詢(xún),因而是非常消耗CPU的。為此,AWorks提供了中斷I/O接口,其可以使GPIO工作在中斷狀態(tài),實(shí)時(shí)監(jiān)控引腳的輸入狀態(tài),只有當(dāng)用戶(hù)期望的狀態(tài)發(fā)生時(shí),才通知用戶(hù),用戶(hù)進(jìn)而執(zhí)行相關(guān)的處理,當(dāng)期望的狀態(tài)沒(méi)有發(fā)生時(shí),則用戶(hù)完全不用關(guān)心引腳的狀態(tài),無(wú)需對(duì)引腳進(jìn)行不斷的輪詢(xún)。

AWorks為I/O中斷相關(guān)的操作定義了一套觸發(fā)接口,用戶(hù)期望的狀態(tài)稱(chēng)之為觸發(fā)條件,當(dāng)GPIO的輸入狀態(tài)滿(mǎn)足觸發(fā)條件時(shí),將自動(dòng)調(diào)用引腳觸發(fā)回調(diào)函數(shù),以通知用戶(hù)作相關(guān)的處理。相關(guān)接口原型詳見(jiàn)表7.7。

表7.7 GPIO觸發(fā)相關(guān)接口函數(shù)

1. 連接引腳觸發(fā)回調(diào)函數(shù)

在使用引腳的觸發(fā)功能前,應(yīng)該首先連接一個(gè)回調(diào)函數(shù)到觸發(fā)引腳,當(dāng)相應(yīng)引腳的觸發(fā)事件產(chǎn)生時(shí),則會(huì)調(diào)用本函數(shù)連接的觸發(fā)回調(diào)函數(shù)。其函數(shù)原型為:

其中,pin為引腳編號(hào),pfunc_callback為指向回調(diào)函數(shù)的指針,其指向的函數(shù)即為本次連接的回調(diào)函數(shù),p_arg為傳遞給回調(diào)函數(shù)的用戶(hù)參數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示連接成功,否則,表示連接失敗,失敗可能是由于該引腳不支持觸發(fā)模式。

pfunc_callback為指向回調(diào)函數(shù)的指針,其類(lèi)型為aw_pfuncvoid_t,該類(lèi)型在aw_types.h文件中定義如下:

由此可見(jiàn),回調(diào)函數(shù)的類(lèi)型是無(wú)返回值,具有一個(gè)void *類(lèi)型參數(shù)的函數(shù)。當(dāng)觸發(fā)事件發(fā)生時(shí),將自動(dòng)調(diào)用pfunc_callback指向的函數(shù),并將連接觸發(fā)回調(diào)函數(shù)時(shí)設(shè)定的p_arg作為回調(diào)函數(shù)的參數(shù)。例如,要將引腳PIO3_6用作觸發(fā)功能,則首先需要連接觸發(fā)回調(diào)函數(shù),范例程序詳見(jiàn)程序清單7.10。

程序清單7.10 連接引腳觸發(fā)回調(diào)函數(shù)范例程序

2. 斷開(kāi)引腳觸發(fā)回調(diào)函數(shù)

與aw_gpio_trigger_connect()函數(shù)的功能相反,當(dāng)一個(gè)引腳不再需要用作觸發(fā)功能時(shí),可以斷開(kāi)引腳與回調(diào)函數(shù)的連接?;蛘弋?dāng)需要將一個(gè)引腳的回調(diào)函數(shù)重新連接到另外一個(gè)函數(shù)時(shí),則應(yīng)該先斷開(kāi)當(dāng)前連接的回調(diào)函數(shù),再重新連接到新的回調(diào)函數(shù)。其函數(shù)原型為:

其中,pin為引腳編號(hào),pfunc_callback 為指向回調(diào)函數(shù)的指針,其值應(yīng)該與連接回調(diào)函數(shù)時(shí)設(shè)定的回調(diào)函數(shù)一致,p_arg為回調(diào)函數(shù)的參數(shù),其值同樣應(yīng)該與連接回調(diào)函數(shù)時(shí)設(shè)定的p_arg一致。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示斷開(kāi)連接成功,否則,表示斷開(kāi)連接失敗,失敗可能是由于參數(shù)錯(cuò)誤造成的。使用范例詳見(jiàn)程序清單7.11。

程序清單7.11 斷開(kāi)引腳觸發(fā)回調(diào)函數(shù)范例程序

3. 配置引腳觸發(fā)條件

連接觸發(fā)回調(diào)函數(shù)后,需要配置引腳觸發(fā)的條件,其函數(shù)原型如下:

其中,pin為引腳編號(hào),flags用于指定觸發(fā)條件。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示配置成功,否則,表示配置失敗,配置失敗可能是由于該引腳不支持配置的觸發(fā)條件。

觸發(fā)條件決定了引腳觸發(fā)的時(shí)機(jī),所有可選的觸發(fā)條件詳見(jiàn)表7.8。

表7.8 GPIO觸發(fā)條件配置宏

實(shí)際中,并不是每一個(gè)引腳都支持表中所有的觸發(fā)條件,當(dāng)配置觸發(fā)條件時(shí),應(yīng)檢測(cè)返回值,確保相應(yīng)引腳支持所配置的觸發(fā)條件。特別地,部分引腳可能不支持觸發(fā)模式,配置任何觸發(fā)條件都會(huì)失敗。

例如,配置PIO3_6為觸發(fā)模式,觸發(fā)條件為下降沿觸發(fā),范例程序詳見(jiàn)程序清單7.12。

程序清單7.12 配置觸發(fā)條件的范例程序

4. 打開(kāi)引腳觸發(fā)

當(dāng)正確連接回調(diào)函數(shù)并設(shè)置相應(yīng)的觸發(fā)條件后,可以打開(kāi)引腳觸發(fā),使引腳觸發(fā)開(kāi)始工作。其函數(shù)原型為:

其中,pin為引腳編號(hào),返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示打開(kāi)成功,否則,表示打開(kāi)失敗,打開(kāi)失敗可能是由于未正確連接回調(diào)函數(shù)或設(shè)置觸發(fā)條件。

綜合連接引腳觸發(fā)回調(diào)函數(shù)和配置引腳觸發(fā)條件的接口,可以實(shí)現(xiàn)一個(gè)完整的引腳觸發(fā)范例程序,詳見(jiàn)程序清單7.13。

程序清單7.13 打開(kāi)引腳觸發(fā)范例程序

程序中,由于需要使用aw_gpio_pin_cfg()將引腳配置為輸入模式,因此,在配置引腳前,同樣先向系統(tǒng)申請(qǐng)了引腳的控制權(quán)。特別地,在aw_gpio_trigger_cfg()前,無(wú)需再次申請(qǐng)。

程序運(yùn)行后,若PIO3_6引腳出現(xiàn)下降沿(可以通過(guò)導(dǎo)線(xiàn)將PIO3_6與GND輕觸幾次),則可以觀(guān)察到LED的狀態(tài)發(fā)生變化。實(shí)際中,若采用輕觸GND的方式產(chǎn)生下降沿,由于輕觸時(shí)會(huì)有抖動(dòng),可能輕觸時(shí)將在短時(shí)間內(nèi)產(chǎn)生多個(gè)下降沿,此時(shí),可能觀(guān)察到LED無(wú)規(guī)律的翻轉(zhuǎn)。

注意,必須先連接回調(diào)函數(shù),再配置引腳的觸發(fā)條件,這個(gè)順序不能顛倒,即不能顛倒程序清單7.13中第18行和第19行的順序。

特別地,當(dāng)將引腳用作觸發(fā)功能時(shí),往往需要將引腳配置為輸入模式。程序清單7.13的第14行程序?qū)⒁_配置為了輸入模式,并開(kāi)啟了上拉,使得PIO3_6在外部懸空狀態(tài)時(shí),仍能處于確定的高電平狀態(tài)。

5. 關(guān)閉引腳觸發(fā)

當(dāng)暫時(shí)不使用引腳觸發(fā)功能時(shí),可以關(guān)閉引腳觸發(fā),引腳觸發(fā)將停止工作,此時(shí),即使?jié)M足配置的觸發(fā)條件,也不會(huì)觸發(fā)調(diào)用引腳相應(yīng)的回調(diào)函數(shù)。其函數(shù)原型為:

其中,pin為引腳編號(hào),返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示關(guān)閉成功,否則,表示關(guān)閉失敗。使用范例詳見(jiàn)程序清單7.14。

程序清單7.14 關(guān)閉引腳觸發(fā)范例程序

當(dāng)引腳觸發(fā)被關(guān)閉后,若需引腳觸發(fā)重新開(kāi)始工作,可以使用aw_gpio_trigger_on()再次打開(kāi)引腳觸發(fā)功能。

7.2 PWM

7.2.1 PWM簡(jiǎn)介

大小和方向隨時(shí)間發(fā)生周期性變化的電流稱(chēng)為交流,交流中最基本的波形稱(chēng)為正弦波,除此之外的波形稱(chēng)為非正弦波。計(jì)算機(jī)、電視機(jī)、雷達(dá)等裝置中使用的信號(hào)稱(chēng)為脈沖波、鋸齒波等,其電壓和電流波形都是非正弦交流的一種。

PWM(Pulse Width Modulation)就是脈沖寬度調(diào)制的意思,一種脈沖編碼技術(shù),即可以按照信號(hào)電平改變脈沖寬度。而脈沖寬度調(diào)制波的周期也是固定的,用占空比(高電平/周期,有效電平在整個(gè)信號(hào)周期中的時(shí)間比率,范圍為0~100%)來(lái)表示編碼數(shù)值。PWM可以用于對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼,也可以通過(guò)高電平(或低電平)在整個(gè)周期中的時(shí)間來(lái)控制輸出的能量,從而控制電機(jī)轉(zhuǎn)速或LED亮度。

PWM信號(hào)是由計(jì)數(shù)器和比較器產(chǎn)生的,比較器中設(shè)定了一個(gè)閾值,計(jì)數(shù)器以一定的頻率自加。當(dāng)計(jì)數(shù)器的值小于閾值時(shí),則輸出一種電平狀態(tài),比如,高電平。當(dāng)計(jì)數(shù)器的值大于閾值,則輸出另一種電平狀態(tài),比如,低電平。當(dāng)計(jì)數(shù)器溢出清0時(shí),又回到最初的電平狀態(tài),即I/O引腳發(fā)生了周期性的翻轉(zhuǎn)而形成PWM波形,詳見(jiàn)圖7.2。

圖7.2 PWM波形圖

當(dāng)計(jì)數(shù)器的值小于閾值時(shí),則輸出高電平;當(dāng)計(jì)數(shù)器的值大于閾值時(shí),則輸出低電平。閾值為45,計(jì)數(shù)器的值最大為100。PWM波形有三個(gè)關(guān)鍵點(diǎn):起始點(diǎn)①,此時(shí)計(jì)數(shù)器的值為0;計(jì)數(shù)器值達(dá)到閾值②,I/O狀態(tài)發(fā)生翻轉(zhuǎn);計(jì)數(shù)器達(dá)到最大值③,I/O狀態(tài)發(fā)生翻轉(zhuǎn),計(jì)數(shù)器的值回到0重新開(kāi)始計(jì)數(shù)。

7.2.2 PWM接口

AWorks提供了接口函數(shù),用于控制PWM輸出,接口原型詳見(jiàn)表7.9。

表7.9 PWM接口函數(shù)(aw_pwm.h)

1. 配置PWM通道

配置一個(gè)PWM通道的周期時(shí)間和高電平時(shí)間,其函數(shù)原型為:

其中,pid為PWM通道的id號(hào),duty_ns為脈寬時(shí)間(單位:ns),period_ns為周期時(shí)間(單位:納秒)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示配置成功,否則,表示配置失敗。

在AWorks中,一個(gè)系統(tǒng)往往可以輸出多個(gè)通道的PWM,各個(gè)通道通過(guò)pid區(qū)分,一個(gè)系統(tǒng)實(shí)際可以輸出PWM的通道數(shù)與具體硬件平臺(tái)相關(guān)。例如,在i.MX28x系統(tǒng)中,可以輸出8路PWM。則PWM通道的編號(hào)為:0 ~ 7,各通道對(duì)應(yīng)的默認(rèn)I/O口詳見(jiàn)表7.10。

表7.10 各通道對(duì)應(yīng)的I/O口

注:實(shí)際中,各個(gè)PWM通道對(duì)應(yīng)的I/O口是可以配置的,具體配置方法詳見(jiàn)SDK配套資料中的《用戶(hù)手冊(cè).pdf》。

輸出PWM的頻率由周期時(shí)間period_ns決定,例如,需要輸出1KHz的PWM,周期時(shí)間為1ms,則period_ns的值為1000000。

輸出PWM的脈寬由duty_ns決定,它和周期值決定了輸出PWM的占空比,占空比即為:duty_ns / period_ns。duty_ns的值不能超過(guò)period_ns。配置PWM通道0輸出PWM的頻率為1KHz,占空比為50%的范例程序詳見(jiàn)程序清單7.15。

程序清單7.15 配置PWM通道的范例程序

2. 使能PWM輸出

PWM通道配置完成后,并不會(huì)輸出PWM。只有使能通道輸出后,才能使相應(yīng)通道開(kāi)始輸出PWM,其函數(shù)原型為:

其中,pid為PWM通道的id號(hào)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示使能成功,PWM開(kāi)始輸出,否則,表示使能失敗,PWM不能正常輸出,失敗原因可能是通道號(hào)設(shè)置有誤。使能PWM通道0輸出的范例程序詳見(jiàn)程序清單7.16。

程序清單7.16 使能PWM輸出范例程序

3. 禁能PWM輸出

若需關(guān)閉PWM通道的輸出,則可以禁能相應(yīng)PWM通道,其函數(shù)原型為:

其中,pid為PWM通道的id號(hào)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示禁能成功,PWM停止輸出,否則,表示禁能失敗。禁能PWM通道0輸出的范例程序詳見(jiàn)程序清單7.17。

程序清單7.17 禁能PWM輸出范例程序

EPC-AW280上板載了一個(gè)無(wú)源蜂鳴器,其對(duì)應(yīng)的原理圖詳見(jiàn)圖7.3,蜂鳴器的控制引腳與GPIO3_29連接,當(dāng)GPIO3_29輸出高電平時(shí),則三極管導(dǎo)通,向蜂鳴器供電;當(dāng)GPIO3_29輸出低電平時(shí),則三極管截止,停止向蜂鳴器供電。對(duì)于無(wú)源蜂鳴器,只要以一定的頻率控制蜂鳴器的“通電”和“斷電”,即可使蜂鳴器產(chǎn)生機(jī)械振動(dòng)音,聲音的頻率與控制信號(hào)的頻率相同,只要頻率在人耳的聽(tīng)覺(jué)范圍內(nèi),即可聽(tīng)到蜂鳴器發(fā)出的聲音。

圖7.3 板載蜂鳴器電路

基于此,可以通過(guò)GPIO3_29輸出一定頻率的PWM,使蜂鳴器發(fā)聲。由表7.10可知,GPIO3_29對(duì)應(yīng)的PWM通道為4。因此,控制PWM通道4輸出PWM即可聽(tīng)到蜂鳴器發(fā)聲。范例程序詳見(jiàn)程序清單7.18。

程序清單7.18 使用PWM輸出驅(qū)動(dòng)蜂鳴器發(fā)聲范例程序

運(yùn)行程序,可以聽(tīng)到蜂鳴器發(fā)出的聲音。由于程序中一直輸出PWM,因此蜂鳴器會(huì)一直鳴叫,若僅需蜂鳴器每秒“嘀”一聲,則可以在不需要發(fā)聲時(shí)禁能PWM輸出。范例程序詳見(jiàn)程序清單7.19。

程序清單7.19 使用PWM控制蜂鳴器每秒“嘀”一聲的范例程序

這里通過(guò)控制PWM的輸出驅(qū)動(dòng)蜂鳴器發(fā)聲,僅為介紹PWM接口的使用方法。實(shí)際中,AWorks已經(jīng)定義了通用的蜂鳴器接口,在應(yīng)用中操作蜂鳴器時(shí),均建議直接使用通用的蜂鳴器接口。

7.3 SPI總線(xiàn)

7.3.1 SPI總線(xiàn)簡(jiǎn)介

SPI(Serial Peripheral Interface)是一種全雙工同步串行通信接口,常用于短距離高速通信,其數(shù)據(jù)傳輸速率通??蛇_(dá)到幾M甚至幾十M。SPI通信采用主/從結(jié)構(gòu),主/從雙方通信時(shí),需要使用到4根信號(hào)線(xiàn):SCLK、MOSI、MISO、CS。其典型的連接示意圖詳見(jiàn)圖7.4。

圖7.4 SPI連接示意圖——單從機(jī)

  • SCLK:時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生;

  • MOSI:主機(jī)數(shù)據(jù)輸出,從機(jī)數(shù)據(jù)輸入;

  • MISO:從機(jī)數(shù)據(jù)輸出,主機(jī)數(shù)據(jù)輸入;

  • CS:片選信號(hào),由主設(shè)備控制。

數(shù)據(jù)傳輸是由主機(jī)發(fā)起的,主機(jī)在串行數(shù)據(jù)傳輸前驅(qū)動(dòng)CS信號(hào),使之變?yōu)橛行顟B(tài)(通常情況下,有效狀態(tài)為低電平),接著,在SCLK上輸出時(shí)鐘信號(hào),在時(shí)鐘信號(hào)的同步下,每個(gè)時(shí)鐘傳輸一位數(shù)據(jù),主機(jī)數(shù)據(jù)通過(guò)MOSI傳輸至從機(jī),從機(jī)數(shù)據(jù)通過(guò)MISO傳輸至主機(jī),數(shù)據(jù)傳輸完畢后,釋放CS信號(hào),使之變?yōu)闊o(wú)效狀態(tài),一次數(shù)據(jù)傳輸完成。

一個(gè)主機(jī)可以連接多個(gè)從機(jī),多個(gè)從機(jī)共用SCLK 、MOSI、MISO三根信號(hào)線(xiàn),每個(gè)從機(jī)的片選信號(hào)CS是獨(dú)立的,因此,若主機(jī)需要連接多個(gè)從機(jī),就需要多個(gè)片選控制引腳。連接示意圖詳見(jiàn)圖7.5。當(dāng)一個(gè)主機(jī)連接多個(gè)從機(jī)時(shí),同一時(shí)刻最多只能使一個(gè)片選信號(hào)有效,以選擇一個(gè)確定的從機(jī)作為數(shù)據(jù)通信的目標(biāo)對(duì)象。也就是說(shuō),在某一時(shí)刻,最多只能激活尋址一個(gè)從機(jī),以使各從機(jī)之間相互獨(dú)立的使用,互不干擾。

圖7.5 SPI連接示意圖——多從機(jī)

注意,單個(gè)通信網(wǎng)絡(luò)中,可以有多個(gè)從機(jī),但有且只能有一個(gè)主機(jī)。

除了需要了解上述SPI的基本概念外,讀者還應(yīng)該理解SPI的傳輸模式,以便在操作SPI從機(jī)器件時(shí),可以正確的設(shè)置SPI主機(jī)的傳輸模式。

SPI數(shù)據(jù)傳輸是在片選信號(hào)有效時(shí),數(shù)據(jù)位在時(shí)鐘信號(hào)的同步下,每個(gè)時(shí)鐘傳輸一位數(shù)據(jù)。根據(jù)時(shí)鐘極性和時(shí)鐘相位的不同,將SPI分為了4種傳輸模式,詳見(jiàn)表7.11。

表7.11 SPI模式

  • 時(shí)鐘極性(CPOL)

時(shí)鐘極性表示了SPI空閑時(shí)的時(shí)鐘極性,可以為高電平(CPOL=1)或低電平(CPOL=0)。

  • 時(shí)鐘相位

時(shí)鐘相位決定了數(shù)據(jù)采樣的時(shí)機(jī),若CPHA=0,則表示數(shù)據(jù)在時(shí)鐘的第一個(gè)邊沿采樣;若CPHA=1,則表示數(shù)據(jù)在時(shí)鐘的第二個(gè)邊沿采樣。

CPHA=0時(shí),對(duì)應(yīng)的模式0(CPOL=0)和模式2(CPOL=1)的示意圖詳見(jiàn)圖7.6。

圖7.6 SPI模式0和模式2示意圖

在SPI模式0(CPOL=0,CPHA=0)中,時(shí)鐘空閑電平為低電平,在傳輸數(shù)據(jù)時(shí),每一位數(shù)據(jù)在第一個(gè)邊沿(即上升沿)采樣。

在SPI模式2(CPOL=1,CPHA=0)中,時(shí)鐘空閑電平為高電平,在傳輸數(shù)據(jù)時(shí),每一位數(shù)據(jù)在第一個(gè)邊沿(即下降沿)采樣。

同理,CPHA=1時(shí),對(duì)應(yīng)的模式1(CPOL=0)和模式3(CPOL=1)的示意圖詳見(jiàn)圖7.7。

圖7.7 SPI模式1和模式3示意圖

在SPI模式1(CPOL=0,CPHA=1)下,時(shí)鐘空閑電平為低電平,在傳輸數(shù)據(jù)時(shí),每一位數(shù)據(jù)在第二個(gè)邊沿(即下降沿)采樣。

在SPI模式3(CPOL=1,CPHA=1)下,時(shí)鐘空閑電平為高電平,在傳輸數(shù)據(jù)時(shí),每一位數(shù)據(jù)在第二個(gè)邊沿(即上升沿)采樣。

7.3.2 SPI總線(xiàn)接口

絕大部分情況下,MCU都作為SPI主機(jī)與SPI從機(jī)器件通信,因此這里僅介紹AWorks中將MCU作為SPI主機(jī)的相關(guān)接口,接口原型詳見(jiàn)表7.12。

表7.12 SPI標(biāo)準(zhǔn)接口函數(shù)

1. 定義SPI從機(jī)器件實(shí)例

對(duì)于用戶(hù)來(lái)講,使用SPI總線(xiàn)的目的往往是用于操作一個(gè)SPI從機(jī)器件,比如,HC595、SPI FLASH等。MCU作為SPI主機(jī)與從機(jī)器件通信,需要知道從機(jī)器件的相關(guān)信息,比如: SPI模式、SPI速率、數(shù)據(jù)位寬等。在AWorks中,定義了統(tǒng)一的SPI從機(jī)器件類(lèi)型:aw_spi_device_t,用于包含從機(jī)器件相關(guān)的信息,以便主機(jī)正確的與之通信。該類(lèi)型的具體定義用戶(hù)無(wú)需關(guān)心,在使用SPI操作一個(gè)從機(jī)器件前,必須先使用該類(lèi)型定義一個(gè)與從機(jī)器件對(duì)應(yīng)的器件實(shí)例,例如:

其中,spi_dev為用戶(hù)自定義的從機(jī)實(shí)例,其地址可作為接口函數(shù)中p_dev的實(shí)參傳遞。

2. 初始化SPI從機(jī)器件實(shí)例

當(dāng)完成SPI從機(jī)器件實(shí)例的定義后,還需要完成其初始化,指定從機(jī)器件相關(guān)的信息,初始化函數(shù)的原型為:

其中,p_dev為指向SPI從機(jī)器件實(shí)例的指針,busid為SPI總線(xiàn)編號(hào),bits_per_word為數(shù)據(jù)位寬,mode為使用的SPI模式,max_speed_hz為從設(shè)備支持的最高時(shí)鐘頻率,cs_pin為從機(jī)設(shè)備的片選引腳,pfunc_cs為自定義的片選引腳控制函數(shù)。

在AWorks中,一個(gè)系統(tǒng)往往具有多條SPI總線(xiàn),各總線(xiàn)之間通過(guò)busid區(qū)分,一個(gè)系統(tǒng)實(shí)際支持的SPI總線(xiàn)條數(shù)與具體硬件平臺(tái)相關(guān)。例如,在i.MX28x系統(tǒng)中,最高可以支持5條SPI總線(xiàn),對(duì)應(yīng)的總線(xiàn)編號(hào)即為:0 ~ 4。busid參數(shù)即用于指定使用那條SPI總線(xiàn)與從機(jī)器件進(jìn)行通信。

表7.13 SPI模式標(biāo)志

bits_per_word指定了數(shù)據(jù)傳輸?shù)奈粚?,一般?lái)講,數(shù)據(jù)均為8位,即每個(gè)數(shù)據(jù)為一個(gè)字節(jié)。

mode為從機(jī)使用的SPI模式(模式0 ~ 模式3,對(duì)應(yīng)的宏定義詳見(jiàn)表7.13),從機(jī)器件一般支持固定的一種或幾種SPI模式,這里的mode用于指定使用何種SPI模式與從機(jī)器件通信。

max_speed_hz為從機(jī)器件支持的最大速率(SCLK最高時(shí)鐘頻率),往往在從機(jī)器件對(duì)應(yīng)的數(shù)據(jù)手冊(cè)上有定義。通常情況下,從機(jī)器件支持的最大速率都是很高的,有時(shí)可能會(huì)超過(guò)MCU中SPI主機(jī)能夠輸出的最大時(shí)鐘頻率,此時(shí),將直接使用MCU中SPI主機(jī)能夠輸出的最大時(shí)鐘頻率。

cs_pin和pfunc_cs均與片選引腳相關(guān)。pfunc_cs是指向自定義片選引腳控制函數(shù)的指針,若pfunc_cs的值為NULL,驅(qū)動(dòng)將自動(dòng)控制由cs_pin指定的引腳實(shí)現(xiàn)片選控制;若pfunc_cs的值不為NULL,指向了有效的自定義片選控制函數(shù),則cs_pin不再被使用,片選控制將完全由pfunc_cs指向的函數(shù)實(shí)現(xiàn)。當(dāng)需要片選引腳有效時(shí)(SPI數(shù)據(jù)傳輸前),系統(tǒng)將自動(dòng)調(diào)用pfunc_cs指向的函數(shù),并傳遞state的值為1。當(dāng)需要片選引腳無(wú)效時(shí)(SPI數(shù)據(jù)傳輸結(jié)束后),也會(huì)調(diào)用pfunc_cs指向的函數(shù),并傳遞state的值為0。一般情況下,片選引腳自動(dòng)控制即可,即設(shè)置pfunc_cs的值為NULL,cs_pin的值設(shè)置為片選引腳,比如:PIO2_19。

例如,要使用SPI0(SPI總線(xiàn)的busid為0)操作74HC595。則首先應(yīng)該定義并初始化一個(gè)與74HC595對(duì)應(yīng)的從機(jī)器件。這就還需要知道幾點(diǎn)重要的信息:數(shù)據(jù)位寬、模式、最高速率和片選引腳。

要獲取這些信息,就必須查看芯片相關(guān)的數(shù)據(jù)手冊(cè)和相應(yīng)的硬件電路。74HC595是一種常用的串行輸入/并行輸出轉(zhuǎn)換芯片,其引腳分布圖詳見(jiàn)圖7.8。

圖7.8 74HC595管腳圖

74HC595內(nèi)部有兩個(gè)8位寄存器:一個(gè)移位寄存器和一個(gè)數(shù)據(jù)鎖存寄存器。移位寄存器的8位數(shù)據(jù)使用Q0’ ~ Q7’表示,其中僅Q7’位對(duì)應(yīng)的電平通過(guò)Q7’引腳輸出,其余位未使用引腳輸出。數(shù)據(jù)鎖存寄存器的8位數(shù)據(jù)使用Q0 ~ Q7表示,并使用Q0 ~ Q7引腳將8位數(shù)據(jù)輸出。

移位寄存器在時(shí)鐘信號(hào)CP的作用下,每個(gè)上升沿將D引腳電平移至移位寄存器的最低位,其余位依次向高位移動(dòng),移位寄存器的值發(fā)生改變,Q7’引腳的輸出隨著值的改變而改變,但此時(shí),數(shù)據(jù)鎖存寄存器中的值保持不變,即Q0 ~ Q7的輸出保持不變。由此可見(jiàn),由于移位作用,原移位寄存器中的最高位Q7’將被完全移除,數(shù)據(jù)丟失。若希望數(shù)據(jù)不丟失,即并行輸出的數(shù)據(jù)超過(guò)8位,則可以將多個(gè)74HC595串接,將Q7’引腳連接至下一個(gè)74HC595的數(shù)據(jù)輸入端D。這樣,每次移位時(shí),原先的Q7’將移動(dòng)至下一個(gè)74HC595中,這也是為什么單獨(dú)將Q7’通過(guò)引腳引出的原因,通過(guò)多個(gè)74HC595級(jí)聯(lián),可以將并行輸出擴(kuò)展為16位、24位、32位等。

數(shù)據(jù)鎖存寄存器的值可以通過(guò)STR引腳輸入上升沿信號(hào)更新,當(dāng)STR引腳輸入上升沿信號(hào)時(shí),數(shù)據(jù)鎖存寄存器中的值將更新為移位寄存器中的值,即Q0 ~ Q7的值更新為Q0’~Q7’的值。這樣的設(shè)計(jì)可以保證同時(shí)改變所有并行輸出,將8位數(shù)據(jù)一次性地在Q0 ~ Q7端輸出,如果不使用數(shù)據(jù)鎖存寄存器,而是直接將移位寄存器的值輸出,則輸出將受到移位過(guò)程的影響,即每次移位,數(shù)據(jù)輸出都可能發(fā)生變化。

除基本的CP時(shí)鐘信號(hào)、D數(shù)據(jù)輸入信號(hào)、STR鎖存信號(hào)、Q0 ~ Q7輸出信號(hào)、Q7’輸出信號(hào)外,還有兩個(gè)控制信號(hào),為鎖存寄存器的輸出使能信號(hào),當(dāng)

74HC595傳輸數(shù)據(jù)的過(guò)程為:D端為數(shù)據(jù)輸入口,在時(shí)鐘CP的作用下每次傳輸一位數(shù)據(jù)至移位寄存器中,如需傳輸8位數(shù)據(jù),則應(yīng)在CP端輸入8個(gè)時(shí)鐘信號(hào),傳輸結(jié)束后,需要在STR上產(chǎn)生一個(gè)上升沿信號(hào),以便將移位寄存器中的數(shù)據(jù)輸出。由此可見(jiàn),其數(shù)據(jù)傳輸?shù)姆绞胶蚐PI傳輸數(shù)據(jù)的方式極為相似,均是在時(shí)鐘信號(hào)的同步下,每個(gè)時(shí)鐘傳輸一位數(shù)據(jù),特殊的,74HC595在傳輸結(jié)束后需要在STR上輸入一個(gè)上升沿鎖存信號(hào)。實(shí)際上,在SPI傳輸中,傳輸數(shù)據(jù)前,主機(jī)會(huì)將片選信號(hào)拉低,傳輸結(jié)束后,主機(jī)會(huì)將片選信號(hào)拉高,顯然,若將STR作為從機(jī)片選信號(hào)由主機(jī)控制,則在數(shù)據(jù)傳輸結(jié)束后,主機(jī)會(huì)將片選信號(hào)拉高,同樣可以達(dá)到在STR上產(chǎn)生上升沿的效果。

基于此,可以將74HC595看作一個(gè)SPI從機(jī)器件,SPI主機(jī)的SCLK時(shí)鐘信號(hào)與CP相連,MOSI作為主出從入,與D相連,CS作為片選信號(hào),與STR相連。此外,74HC595作為一個(gè)串/轉(zhuǎn)并芯片,只能輸出數(shù)據(jù),不能輸入數(shù)據(jù),即SPI主機(jī)只需向74HC595發(fā)送數(shù)據(jù),不需要從74HC595接收數(shù)據(jù),因此,無(wú)需使用SPI的MISO引腳。

MiniPort-595模塊采用74HC595擴(kuò)展8路I/O,可以直接驅(qū)動(dòng)LED顯示模塊,其等效電路詳見(jiàn)圖7.9。由此可見(jiàn),模塊僅有3路信號(hào)輸入,但可并行輸出8位數(shù)據(jù)。電路中,將 直接接地,固定為低電平,使能了數(shù)據(jù)鎖存寄存器的輸出。將 直接與電源連接,固定為高電平,即不使用其復(fù)位功能,使其不影響移位寄存器的值。

圖7.9 74HC595電路圖

實(shí)際中,當(dāng)MiniPort-595與i.MX28x的擴(kuò)展板連接時(shí),MOSI、SCLK與i.MX28x的SPI0連接,片選信號(hào)CS與PIO2_19連接。

在初始化與74HC595對(duì)應(yīng)的SPI從機(jī)器件實(shí)例時(shí),還需要獲取到數(shù)據(jù)寬度、SPI模式、最高時(shí)鐘頻率等信息。即:

  • 數(shù)據(jù)寬度

74HC595只有8個(gè)并行輸出口,內(nèi)部寄存器也均為8位,因此,單次傳輸?shù)臄?shù)據(jù)為8位,SPI傳輸時(shí)的數(shù)據(jù)寬度即為8。

  • SPI模式

數(shù)據(jù)在CP時(shí)鐘信號(hào)的上升沿被采樣送入74HC595的移位寄存器,對(duì)空閑時(shí)鐘電平?jīng)]有要求,根據(jù)SPI幾種模式的定義可知(詳見(jiàn)圖7.6和圖7.7),模式0和模式3均是在時(shí)鐘上升沿采樣數(shù)據(jù),因此,使用模式0和模式3均可,后續(xù)的程序選擇模式3作為范例。

  • 最高時(shí)鐘頻率

雖然74HC595支持的最高時(shí)鐘頻率可達(dá)100MHz,但實(shí)際中,受到MCU處理速度的限制以及MCU輸出引腳翻轉(zhuǎn)頻率的限制,往往并不能達(dá)到該值。因此,最高時(shí)鐘頻率可以先設(shè)置在一個(gè)相對(duì)合理的范圍,比如,3000000Hz(3MHz)。后續(xù)若3MHz不滿(mǎn)足應(yīng)用需求,可以在此基礎(chǔ)上根據(jù)需要調(diào)大調(diào)小即可。

基于以上信息,可以定義并初始化一個(gè)與74HC595對(duì)應(yīng)的SPI從機(jī)器件實(shí)例,范例詳見(jiàn)程序清單7.20。

程序清單7.20 初始化從機(jī)器件實(shí)例的范例程序

3. 設(shè)置SPI從機(jī)器件實(shí)例

設(shè)置SPI從機(jī)實(shí)例時(shí),會(huì)檢查MCU的SPI主機(jī)是否支持從機(jī)實(shí)例的相關(guān)參數(shù)和模式。如果不能支持,則設(shè)置失敗,說(shuō)明該從機(jī)不能使用。其函數(shù)原型為:

其中,p_dev是指向SPI從機(jī)器件實(shí)例的指針。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示設(shè)置成功,否則,表示設(shè)置失敗,存在不支持的位寬、速率或模式等。

例如,在完成74HC595的初始化后,再通過(guò)該接口設(shè)置一次74HC595器件實(shí)例,范例程序詳見(jiàn)程序清單7.21。

程序清單7.21 設(shè)置SPI從機(jī)器件實(shí)例的范例程序

4. 先寫(xiě)后讀

當(dāng)設(shè)定好從機(jī)實(shí)例后,即可與從機(jī)器件進(jìn)行數(shù)據(jù)交互。雖然SPI協(xié)議是可以全雙工通信的,即數(shù)據(jù)的發(fā)送和接收同時(shí)進(jìn)行,但絕大部分情況下,并不會(huì)同時(shí)發(fā)送數(shù)據(jù)或接收數(shù)據(jù),往往數(shù)據(jù)時(shí)單向進(jìn)行的,即發(fā)送的時(shí)候不接收數(shù)據(jù),或接收的時(shí)候不發(fā)送數(shù)據(jù)。

基于常見(jiàn)的SPI從機(jī)器件的操作方法,AWorks定義了兩種情形下的數(shù)據(jù)通信:先寫(xiě)入一段數(shù)據(jù)至從機(jī),再讀取一段數(shù)據(jù);先寫(xiě)入一段數(shù)據(jù)至從機(jī),再寫(xiě)入一段數(shù)據(jù)。之所以均是先寫(xiě)入一段數(shù)據(jù),是因?yàn)榻^大多數(shù)數(shù)從機(jī)器件在操作前,首先都要發(fā)送一段命令數(shù)據(jù)至從機(jī),以指定接下來(lái)的具體操作(讀數(shù)據(jù)或?qū)憯?shù)據(jù))。

先寫(xiě)后讀即是主機(jī)先發(fā)送數(shù)據(jù)至從機(jī)(寫(xiě)),再自從機(jī)接收數(shù)據(jù)(讀)。注意,該函數(shù)會(huì)等待數(shù)據(jù)傳輸完成后才會(huì)返回,因此該函數(shù)是阻塞式的,不應(yīng)在中斷環(huán)境中調(diào)用。其函數(shù)原型為:

其中,p_dev指向從機(jī)器件實(shí)例,表示本次數(shù)據(jù)通信的目標(biāo)對(duì)象,p_txbuf指向需要首先寫(xiě)入從機(jī)的數(shù)據(jù),n_tx為寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)。p_rxbuf指向數(shù)據(jù)發(fā)送完成后,接收數(shù)據(jù)的緩沖區(qū),n_rx為接收數(shù)據(jù)的個(gè)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示數(shù)據(jù)傳輸成功,否則,表示數(shù)據(jù)傳輸失敗。

注意,若只需要寫(xiě)入數(shù)據(jù),不需要讀取數(shù)據(jù),則可以將p_rxbuf設(shè)置為NULL,n_rx設(shè)置為0,同理,若只需要讀取數(shù)據(jù),不需要發(fā)送數(shù)據(jù),則可以將p_txbuf設(shè)置為NULL,n_tx設(shè)置為0。例如,需要發(fā)送數(shù)據(jù)至74HC595,以并行輸出8位數(shù)據(jù)0x55,則范例程序詳見(jiàn)程序清單7.22。

程序清單7.22 先寫(xiě)后讀范例程序(1)

為了更加直觀(guān)的觀(guān)察輸出數(shù)據(jù)是否正確,可以將MiniPort-LED與MiniPort-595連接,等效電路圖詳見(jiàn)圖7.10,由此可見(jiàn),74HC595的輸出端為低電平時(shí),對(duì)應(yīng)LED點(diǎn)亮, 0x55對(duì)應(yīng)的二進(jìn)制為01010101,因此,若成功輸出,則可以觀(guān)察到LED1、LED3、LED5和LED7被點(diǎn)亮,LED0、LED2、LED4和LED6被熄滅。

圖7.10 MiniPort-595 + MiniPort-LED等效電路圖

由于74HC595使用簡(jiǎn)單,只能寫(xiě)入數(shù)據(jù),因此,上述范例程序并沒(méi)有用到讀取數(shù)據(jù)。實(shí)際上,對(duì)于常見(jiàn)的SPI從機(jī)器件,其通信協(xié)議往往都是采用“命令”+“數(shù)據(jù)”的格式。如典型的SPI FLASH從機(jī)器件:MX25L1606,在對(duì)其操作時(shí),均需要先寫(xiě)1字節(jié)的命令,后續(xù)再是具體的數(shù)據(jù),具體數(shù)據(jù)的含義隨著命令的不同而不同。例如,每個(gè)MX25L1606內(nèi)部具有一個(gè)3字節(jié)的電子ID號(hào)(RDID),如需讀取該ID,則需要先發(fā)送單字節(jié)的命令0x9f。則使用先寫(xiě)后讀接口讀取ID的關(guān)鍵語(yǔ)句詳見(jiàn)程序清單7.23。

程序清單7.23 先寫(xiě)后讀范例程序(2)

更多命令以及RDID的含義詳見(jiàn)相應(yīng)的數(shù)據(jù)手冊(cè),這里僅用于說(shuō)明對(duì)于這種常見(jiàn)的操作方法,如何正確的使用SPI接口。

5. 連續(xù)兩次寫(xiě)

連續(xù)兩次寫(xiě),即主機(jī)先發(fā)送一段數(shù)據(jù)至從機(jī)(寫(xiě)),發(fā)送結(jié)束后,再發(fā)送一段數(shù)據(jù)至從機(jī)(寫(xiě))。注意,該函數(shù)會(huì)等待數(shù)據(jù)傳輸完成后才會(huì)返回,因此該函數(shù)是阻塞式的,不應(yīng)在中斷環(huán)境中調(diào)用。其函數(shù)原型為:

其中,p_dev指向從機(jī)器件實(shí)例,表示本次數(shù)據(jù)通信的目標(biāo)對(duì)象,p_txbuf0指向需要首先寫(xiě)入從機(jī)的數(shù)據(jù),n_tx0為寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)。p_txbuf0指向數(shù)據(jù)發(fā)送完成后,開(kāi)始發(fā)送下一段數(shù)據(jù),p_txbuf1指向需要再次寫(xiě)入從機(jī)的數(shù)據(jù),n_tx1為寫(xiě)入數(shù)據(jù)的字節(jié)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示數(shù)據(jù)傳輸成功,否則,表示數(shù)據(jù)傳輸失敗。

注意,若只需要寫(xiě)入一段數(shù)據(jù),則可以將p_txbuf1設(shè)置為NULL,n_tx1設(shè)置為0。

同樣可以使用該接口發(fā)送數(shù)據(jù)至74HC595,例如,使用MiniPort-595控制MiniPort-LED,使LED0 ~ LED7依次循環(huán)點(diǎn)亮,實(shí)現(xiàn)簡(jiǎn)易的流水燈效果,范例程序詳見(jiàn)程序清單7.24。

程序清單7.24 執(zhí)行連續(xù)兩次寫(xiě)的范例程序(1)

程序中,由于LED是低電平點(diǎn)亮,因此,通過(guò)74HC595輸出數(shù)據(jù)時(shí),需要將data取反,以便使數(shù)據(jù)中與需要點(diǎn)亮的LED相應(yīng)位的值為0。

由于74HC595只能寫(xiě)入單字節(jié)數(shù)據(jù),因此,上述范例程序并沒(méi)有使用到第二次的數(shù)據(jù)寫(xiě)入,第二次寫(xiě)入的數(shù)據(jù)緩沖區(qū)被設(shè)定為了NULL。為了更全面的說(shuō)明該接口的用法,同樣以MX25L1606為例,如果要在SPI FLASH存儲(chǔ)器中存入一段數(shù)據(jù),則應(yīng)先發(fā)送命令0x02和存儲(chǔ)數(shù)據(jù)的起始地址(3字節(jié),24位),接著再發(fā)送實(shí)際的待存儲(chǔ)的數(shù)據(jù)。寫(xiě)入數(shù)據(jù)至指定地址的關(guān)鍵語(yǔ)句詳見(jiàn)程序清單7.25。

程序清單7.25 執(zhí)行連續(xù)兩次寫(xiě)的范例程序(2)

實(shí)際中,寫(xiě)入數(shù)據(jù)前,應(yīng)確保相應(yīng)區(qū)域被擦除,擦除同樣有相關(guān)的命令,更多命令以及數(shù)據(jù)存儲(chǔ)的注意事項(xiàng)詳見(jiàn)相應(yīng)的數(shù)據(jù)手冊(cè),這里僅用于說(shuō)明連續(xù)兩次寫(xiě)接口的使用方法。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17984

    瀏覽量

    367127
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317678

原文標(biāo)題:AWorks軟件篇 — 通用外設(shè)接口(GPIO、PWM、SPI)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux嵌入式和單片機(jī)嵌入式的區(qū)別?

    Processor Unit)。 2. 單片機(jī)嵌入式(也稱(chēng)為嵌入式微控制器MCU): 定義:一種集成電路,能夠一個(gè)芯片
    發(fā)表于 06-20 09:46

    運(yùn)行在嵌入式系統(tǒng)的emApps

    在當(dāng)今快節(jié)奏的嵌入式系統(tǒng)世界,靈活性和適應(yīng)性是嵌入式系統(tǒng)實(shí)現(xiàn)的關(guān)鍵。SEGGER推出了其最新創(chuàng)新:Embedded apps(emApps
    的頭像 發(fā)表于 06-18 09:53 ?304次閱讀
    運(yùn)行在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>上</b>的emApps

    Python嵌入式系統(tǒng)的應(yīng)用場(chǎng)景

    你想把你的職業(yè)生涯提升到一個(gè)新的水平?Python嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)嵌入式開(kāi)發(fā)更多地依賴(lài)于C和C++語(yǔ)言
    的頭像 發(fā)表于 03-19 14:10 ?720次閱讀

    iic協(xié)議嵌入式系統(tǒng)的功能

    現(xiàn)代電子設(shè)備,嵌入式系統(tǒng)的設(shè)計(jì)越來(lái)越復(fù)雜,需要集成更多的功能和外設(shè)。I2C協(xié)議因其簡(jiǎn)單性、靈
    的頭像 發(fā)表于 02-05 11:40 ?600次閱讀

    PLD嵌入式系統(tǒng)的應(yīng)用實(shí)例

    ,如快速開(kāi)發(fā)周期、低功耗和高度集成,被廣泛應(yīng)用于各種嵌入式應(yīng)用。 一、PLD的基本概念 PLD是一種可以通過(guò)電子方式重新編程的集成電路,它允許設(shè)計(jì)者
    的頭像 發(fā)表于 01-20 09:42 ?807次閱讀

    嵌入式主板的概述與發(fā)展

    隨著科技的迅猛發(fā)展,嵌入式系統(tǒng)現(xiàn)代電子產(chǎn)品扮演著越來(lái)越重要的角色。嵌入式主板作為嵌入式
    的頭像 發(fā)表于 01-13 16:30 ?784次閱讀
    <b class='flag-5'>嵌入式</b>主板的概述與發(fā)展

    MPU嵌入式系統(tǒng)的應(yīng)用

    一、MPU的基本功能 微處理器單元(MPU)是嵌入式系統(tǒng)的大腦,負(fù)責(zé)執(zhí)行程序指令、處理數(shù)據(jù)和控制其他硬件設(shè)備。MPU的基本功能包括: 指令執(zhí)行:MPU能夠從存儲(chǔ)器讀取指令,解碼這些
    的頭像 發(fā)表于 01-08 09:26 ?917次閱讀

    LDO嵌入式系統(tǒng)的應(yīng)用 常見(jiàn)LDO故障及解決方法

    LDO嵌入式系統(tǒng)的應(yīng)用 LDO(Low Dropout Regulator,低降壓線(xiàn)性穩(wěn)壓器)是一種常用的電源管理集成電路,它在
    的頭像 發(fā)表于 12-13 09:08 ?2288次閱讀

    新手怎么學(xué)嵌入式?

    嵌入式系統(tǒng)的發(fā)展,嵌入式操作系統(tǒng)也變得越來(lái)越重要。學(xué)習(xí)嵌入式操作系統(tǒng)可以幫助你更好地管理
    發(fā)表于 12-12 10:51

    嵌入式系統(tǒng)開(kāi)發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開(kāi)發(fā)常見(jiàn)問(wèn)題解決

    嵌入式系統(tǒng)開(kāi)發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)是專(zhuān)為特定應(yīng)用設(shè)計(jì)的計(jì)算機(jī)系統(tǒng),它們通常嵌入在所控制的設(shè)備
    的頭像 發(fā)表于 12-09 09:38 ?974次閱讀

    嵌入式系統(tǒng)的未來(lái)趨勢(shì)有哪些?

    會(huì)更加模塊化和集成化,允許更容易的硬件和軟件的切換和升級(jí)。這會(huì)提高系統(tǒng)的可維護(hù)性和可擴(kuò)展性,會(huì)使得系統(tǒng)能夠適應(yīng)不斷變化的應(yīng)用需求。 5. 生態(tài)可持續(xù)性與環(huán)保材料
    發(fā)表于 09-12 15:42

    ARM MCU嵌入式開(kāi)發(fā) | 基于國(guó)產(chǎn)GD32F10x芯片+嵌入的開(kāi)始

    分為型嵌入式系統(tǒng)、中等規(guī)模嵌入式系統(tǒng)、復(fù)雜嵌入式系統(tǒng)。 嵌入
    發(fā)表于 09-09 14:48

    七大嵌入式GUI盤(pán)點(diǎn)

    允許開(kāi)發(fā)者資源受限的設(shè)備創(chuàng)建和提供類(lèi)似智能手機(jī)的用戶(hù)體驗(yàn)。這個(gè)框架是Qt生態(tài)系統(tǒng)的一部分,旨在將Qt的創(chuàng)造力帶入嵌入式微控制器領(lǐng)域,支持跨微處理器(MPU)和微控制器(
    發(fā)表于 09-02 10:58

    極海半導(dǎo)體亮相2024全球MCU嵌入式生態(tài)發(fā)展大會(huì)

    7月25日,由AspenCore主辦的2024全球MCU嵌入式生態(tài)發(fā)展大會(huì),深圳羅湖君悅酒店如期舉行。此次大會(huì)為來(lái)自消費(fèi)電子、家電、工業(yè)控制、通信網(wǎng)絡(luò)、新能源汽車(chē)、物聯(lián)網(wǎng)領(lǐng)域、儲(chǔ)能領(lǐng)域的OEM廠(chǎng)商和
    的頭像 發(fā)表于 07-26 15:18 ?1209次閱讀

    嵌入式工控機(jī)的優(yōu)勢(shì)與示例

    和可靠性進(jìn)行了優(yōu)化,并且通常具有固定用途,運(yùn)行專(zhuān)用軟件來(lái)控制和監(jiān)控設(shè)備的操作。嵌入式工控機(jī)有多種形式,從具有最小處理能力的微控制器到具有更大計(jì)算能力的更復(fù)雜的
    的頭像 發(fā)表于 07-24 16:25 ?751次閱讀
    <b class='flag-5'>嵌入式</b>工控機(jī)的優(yōu)勢(shì)與示例