一、概述
上篇文章介紹了透過 Game Controller Tester 測試軟體實測方案 Gamming Controller 的方法,本文章針對該方案的輸入介面 Sample Code 相關 GPIO、ADC 的 initialization、Function 判斷方式做介紹。
二、 模組板輸入介面:
2.1 基本輸入單元 ( 如圖 2 ),GPIO 與 ADC Pin Define ( 如圖 1 )
圖 1
2.2 Connector 單元 ( 如圖 3 )
Vibration Motor Power Select ( CON1、CON2 ):Pin 1、2 配置短路 Pin 使 Vibration Motor 為 1.8 V
Vibration Motor Output ( J9、J10 ):Vibration Motor 配置端口
圖 3
三、 Debug 方式:
3.1 本文章使用 LPC Link 2 作為 debug tool,LPC Link 2 透過 SWD Port 對 Gamming Controller 做 debug,線路配置方式如圖 4
3.2 將 USB Cable 與模組板 USB Connector 連結,如圖 5
3.3 將 USB Cable 與 LPC Link2 USB Connector 連結,如圖 6
四、GPIO、ADC initialization
4.1 在 main > XBOX_Init > XBOX_DigitalChannelInit 中執行項目 ( 如圖 8 )
4.1.1 宣告一變數 key_config 將對 GPIO input 的相關參數儲存其中,參數如下:
a ) kGPIO_DigitalInput > 宣告為 DigitalInput mode
b ) 1 > GPIO_PinInit function 中在 Input 模式中不做判斷
4.1.2 宣告一變數 motor_config 將對 GPIO input 的相關參數儲存其中,參數如下:
a ) kGPIO_DigitalOutput > 宣告為 DigitalOutput mode
b ) 0 > GPIO_PinInit function 中為 Output 輸出為 Low
4.1.3 宣告一變數 port_pin_config 將對 GPIO input 的相關參數儲存其中,參數如下:
a ) IOCON_PIO_FUNC0 : 選擇 IOCON function 為 0 ( GPIO 功能 )
b ) IOCON_PIO_MODE_PULLUP : 宣告使用 MCU 內部 pull up
c ) IOCON_PIO_SLEW_STANDARD : 選擇 Driver slew rate 為 Standard-mode
d ) IOCON_PIO_INV_DI : 當 GPIO 為 input時輸入功能不反轉
e ) IOCON_PIO_DIGITAL_EN : 設定為 digital input
f ) IOCON_PIO_OPENDRAIN_DI : 宣告為 Normal push-pull output mode
4.1.4 GPIO_PinInit function 中有 4 個參數需填入如下:
a ) GPIO : 對應到 LPC5528 的 GPIO register address ( 0x4008C000 )
b ) JOYSTICK_KEY_X_PORT : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 1 )
c ) JOYSTICK_KEY_X_PIN : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 1 Pin 25 )
d ) key_config : 該參數用來定義 GPIO register 的 In/Out put 與 Output 時的輸出邏輯為 high 或 low,詳細參數說明如 4.1.1 所示
4.1.5 IOCON_PinMuxSet function 中有 4 個參數需填入如下:
a ) IOCON : 對應到 LPC5528 的 IOCON register address ( 0x40001000 )
b ) JOYSTICK_KEY_X_PORT : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 1 )
c ) JOYSTICK_KEY_X_PIN : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 1 Pin 25 )
d ) port_pin_config : 該參數用來定義 IOCON register 的參數,詳細參數說明如 4.1.3 所示
4.1.6 GPIO_PinInit function 中有 4 個參數需填入如下:
a ) GPIO : 對應到 LPC5528 的 GPIO register address ( 0x4008C000 )
b ) JOYSTICK_Motor_Left : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 )
c ) JOYSTICK_Motor_Left : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 8 )
d ) motor_config : 該參數用來定義 GPIO register 的 In/Out put 與 Output 時的輸出邏輯為 high 或 low,詳細參數說明如 4.1.2 所示
* 其餘 GPIO Port Pin 設定相同因此後續說明省略
4.2 在 main > BOARD_InitBootPins 中執行項目如下 ( 如圖 9 )
4.2.1 CLOCK_EnableClock(kCLOCK_Iocon) : 使 MCU 內 Iocon CLOCK 起震
4.2.2 CLOCK_EnableClock(kCLOCK_Gpio0) : 使 MCU 內 Gpio0 CLOCK 起震
4.2.3 CLOCK_EnableClock(kCLOCK_Gpio1) : 使 MCU 內 Gpio1 CLOCK 起震
4.2.4 宣告一變數 port0_pin23_config 將對 P0_23 ( ADC_CH0 ) 的相關參數儲存其中,參數如下:
a ) IOCON_PIO_FUNC0 : 選擇 IOCON function 為 0 ( GPIO 功能 )
b ) IOCON_PIO_MODE_INACT : 針對該 Port Pin 不做內部上、下拉電阻功能
c ) IOCON_PIO_SLEW_STANDARD : 選擇 Driver slew rate 為 Standard-mode
d ) IOCON_PIO_INV_DI : 當 GPIO 為 input時輸入功能不反轉
e ) IOCON_PIO_ANALOG_EN : 啟用類比通道
f ) IOCON_PIO_OPENDRAIN_DI : 設定為 digital input
g ) IOCON_PIO_ASW_EN : 方案 MCU 為 1B 版 ( CPU 150 MHz ) 因此此處設定為開啟
4.2.5 IOCON_PinMuxSet function 中有 4 個參數需填入如下
a ) IOCON : 對應到 LPC5528 的 IOCON register address ( 0x40001000 )
b ) 0U : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 )
c ) 23U : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 23 )
d ) port_pin_config : 該參數用來定義 IOCON register 的參數,詳細參數說明如 4.2.4 所示
* 其餘 ADC Port Pin 設定相同因此後續說明省略
4.3 在 main > ADC_Init > 中執行項目如下 ( 如圖 10 )
4.3.1 CLOCK_SetClkDiv(kCLOCK_DivAdcAsyncClk, 2U, true) : ADC Clock 除頻設定為倍率 2,並且帶入參數 3 的 true 執行 divider counter reset
4.3.2 CLOCK_AttachClk(kFRO_HF_to_ADC_CLK) : ADC Clock 來源參考 FRO_HF
4.3.3 POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC) : 關閉 LDOGPADC power down
4.3.4 LPADC_GetDefaultConfig(&mLpadcConfigStruct) : 獲取 ADC defaultconfig 的參數值,後續將針對除了 default 以外 ADC config 所需變更的參數進行設定
a ) mLpadcConfigStruct.enableAnalogPreliminary : 開啟 ADC 以高直流電流消耗為代價,降低 ADC 啟動延遲的現象
b ) mLpadcConfigStruct.referenceVoltageSource = DEMO_LPADC_VREF_SOURCE : 將參考電壓設定為 VREF Pin 輸入的電壓值
c ) mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128 : 啟用自動校準平均值功能,並設定為 128 筆平均值
4.3.5 LPADC_Init(DEMO_LPADC_BASE, &mLpadcConfigStruct) : 將 mLpadcConfigStruct 的相關參數設定到對應的 ADC 參數中
4.3.6 LPADC_DoOffsetCalibration(DEMO_LPADC_BASE) : 啟動 ADC 偏移校準功能
4.3.7 LPADC_DoAutoCalibration(DEMO_LPADC_BASE) : 啟動 ADC 自動校準功能
* 以下為 ADC0_0 ~ ADC0_12 的相關設定,因設定方式皆相同,因此僅說明 ADC0_0 的部分 ( 如圖 11 )
4.3.8 LPADC_GetDefaultConvCommandConfig(&ADC0_0_Command) : 獲取 ADC defaultConvCommandConfig 的參數值,後續將針對除了 default 以外 ADC ConvCommandConfig 所需變更的參數進行設定
a ) ADC0_0_Command.channelNumber = ADC0_0 : 將 ADC0_0 Channel 參數設定到 ADC0_0_Command 中
b ) ADC0_0_Command.conversionResolutionMode = kLPADC_ConversionResolutionHigh : 選擇 ADC 解析度為 16 bit
4.3.9 LPADC_SetConvCommandConfig function 中有 3 個參數需填入如下,並將參數設定到 ADC register 中 :
a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000
b ) DEMO_LPADC_USER_CMDID : 對應 LPC5528 的 ADC command low buffer register 為第幾組,DEMO_LPADC_USER_CMDID 參數為 1
c ) ADC0_0_Command : 該參數用來定義 ADC register 中的 CMDL 與 CMDH 參數,詳細參數說明如 4.3.6 所示
4.3.10 LPADC_GetDefaultConvTriggerConfig(&ADC0_0_Tigger) : 獲取 ADC defaultConvTriggerConfig 的參數值,後續將針對除了 default 以外 ADC ConvTriggerConfig 所需變更的參數進行設定
a ) ADC0_0_Tigger.targetCommandId = DEMO_LPADC_USER_CMDID : 將對應的 ADC0_0 Tigger 參數設定到 targetCommandId 中,後續當 對應的 ADC0_0 Tigger 被出發時,ADC0_0 則會開始執行 Sampling
b ) ADC0_0_Tigger.enableHardwareTrigger = false : 將 Hardware Trigger 關
4.3.11 LPADC_SetConvTriggerConfig function 中有 3 個參數需填入如下,並將參數設定到 ADC register 中 :
a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000
b ) 0U : 對應 LPC5528 的 ADC Trigger control register 為第幾組,0U 參數為 0
c ) ADC0_0_Tigger : 該參數用來定義 ADC register 中的 TCTRL 參數,詳細參數說明如 4.3.8 所示
4.4 在 main > while 中執行項目如下 ( 如圖 12、13 )
4.4.1 ADC_VALUE_print0 = ((ADC_Value(ADC0_0_READ)) >> g_LpadcResultShift) > 設定 ADC0_0 software trigger 並將結果放置於 ADC_VALUE_print0 變數中
* 其餘 ADC Sampling 與取得結果的方式相同,因此後續說明省略
4.4.1.1 ADC_Value(ADC0_0_READ) > LPADC_DoOffsetCalibration(DEMO_LPADC_BASE) > 啟動 ADC 偏移校準功能
4.4.1.2 ADC_Value(ADC0_0_READ) > LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1<<ADC_num) > 將軟件觸發轉換指令設定到 ADC SWTRIG register
4.4.1.3 while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &ADC0_0_Result, 0U)){} > 等待 ADC0_0 轉換完成,並將轉換結果放到 ADC0_0_Result.convValue 中,
而後即可將 ADC 轉換完畢的資訊透過 USB 傳輸到 PC 達成功能。