SAM4E微控制器之旅 15 觸屏輸入與SPI通訊

2022-02-12 13:52:25 字數 2861 閱讀 9458

開發板上配了乙個電阻觸控螢幕,它的控制器是ads7843,使用spi進行通訊。這次實現的功能是通過spi介面與該控制器互動,獲取觸控螢幕點選的座標,並顯示在lcd上。略為難點的是spi作為同步時鐘的一種,需要判斷時鐘的極性以及相位。

為了突出主題,就沒有對電阻屏進行校準,顯示的是控制器原始的輸出值。

pa12、pa13和pa14引腳的外設a為spi相關引腳,pa11為spi的npcs0。即,該控制器連線在spi的片選裝置0

通訊時序與時鐘極性、相位:

上圖是ads7843,在進行12位轉換時,通訊的時序圖。

可以看到,每次傳輸的資料為8位。而在時鐘無效時,時鐘引腳是保持低電平的。並且,在乙個時鐘週期內,在第乙個時鐘邊沿(即上公升沿)時,傳輸的資料不變,即表示在時鐘的第乙個邊沿進行資料採集;而在時鐘第二個邊沿(即下降沿)時,資料改變。

接收資料時的注意事項:

單獨注意下ads7843輸出時的時序。

在第一次傳輸的過程中,在第乙個時鐘的上公升沿時,其輸出為低電平。而有效的資料在第二個時鐘才開始被採集到。這意味著,第一次傳輸時spi主機的接收到的資料中,只有低7位是有效的

同樣也可以看到,在第二次傳輸時,則有5位有效資料被傳輸。

先實現一些輔助的函式,完成一些子功能。

引腳及常用命令的巨集定義。

/* ads7843 引腳 */

#define rt_busy_pin pio_pa17

#define rt_irq_pin pio_pa16

/* ads7843 命令相關 */

#define rt_cmd_start (1<<7)

#define rt_cmd_switch_shift 4

#define rt_cmd_pd_mod 0x3 //不休眠且不產生中斷

/* ads7843 常用命令 */

#define rt_cmd_enable_penirq \

((1 << rt_cmd_switch_shift) | rt_cmd_start)

#define rt_cmd_x_pos \

((5 << rt_cmd_switch_shift) | rt_cmd_start| rt_cmd_pd_mod)

#define rt_cmd_y_pos \

((1 << rt_cmd_switch_shift) | rt_cmd_start | rt_cmd_pd_mod)

spi傳送資料,並返回接收到的資料。在實際運用中,可能需要進行超時的處理。

uint16_t spisend(uint16_t data)

向ads7843傳送命令,並取得返回值。

/*這個函式預設傳送完命令後,ads7843會返回兩次資料 */

uint32_t rtouchsendcmd(uint8_t uc_cmd)

gpio引腳復用配置。將pa11—pa14復用為外設a,pa16和pa17配置為輸入引腳。

// **略……
spi設定。下面直接給我設定的**,如此設定的原因已經在上一小節說明。對於波特率的選擇,ads7843的晶元手冊中只要求了乙個在時鐘脈衝中,高電平和低電平的出現時間不少於200ns。在這裡選擇的波特率為1 mhz(mck為96 mhz)

/* pmc */

pmc->pmc_pcer0 = (1 << id_spi);

const uint32_t rt_spi_cs = 0; // 片選裝置0

spi->spi_mr = spi_mr_mstr // master 模式

| spi_mr_modfdis // 關閉模式檢測

| spi_mr_pcs(~(1

spi_csr_bits_8_bit // 每次傳輸8位元資料

| (spi_csr_cpol & 0) // 時鐘無效時為低電平

| spi_csr_ncpha // 在時鐘的首邊沿進行資料採集

| spi_csr_csaat // 傳輸完成後保持片選

| spi_csr_scbr(96) // 波特率為對mck進行96分頻

;spi->spi_cr = spi_cr_spien; // 使能spi

使能ads7843中斷

rtouchsendcmd(rt_cmd_enable_penirq);
需要實現的功能在有觸控輸入時,將ads7843的輸出繪製在lcd上。有了前面的基礎,而且功能不複雜,所以實現起來也較為簡單,直接看**即可。

#include int pos_x, pos_y;

char print_buf[64];

const ili93xx_color_t bg_color = color_white;

const ili93xx_color_t fg_color = color_black;

ili93xx_fill(bg_color);

while (1)

}

微控制器學習之旅(三)

二進位制,十進位制和十六進製制 十進位制是我們日常生活中常用的,就不再多說了。二進位制是實現計算機系統的最基本的理論基礎,計算機晶元是基於成千上萬個開關管組合而成的,它們每乙個都只能有開和關兩種狀態,對應二進位制的1和0兩個值。16進製制本質上是同二進位制是一樣的,是二進位制的一種縮寫形式也是程式編...

微控制器作業1

1.微處理器的兩個發展趨勢?2.常用可程式設計處理器有哪三種?3.微控制器的結構特點和應用特點是什麼?4.什麼叫混合訊號處理器?5.什麼是 單片 解決方案?6.msp430的工作電壓多高?是多少位的微控制器?目前最高工作頻率多少mhz?7.什麼是精簡指令集,什麼是複雜指令集?8.msp430 單片 ...

51微控制器學習筆記(1) 初識微控制器

微控制器是一種整合在電路晶元,是採用超大規模積體電路技術把具有資料處理能力的 處理器cpu 隨機儲存器ram 唯讀儲存器rom 多種i o口和中斷系統 定時器 計數器等功能 可能還包括顯示驅動電路 脈寬調變電路 模擬多路轉換器 a d轉換器等電路 整合到一塊矽片上構成的乙個小而完善的計算機系統。微控...