2016年12月29日 星期四

DIY - PIC24:PIC24FJ64GA008 NOKIA 5110 LCD 模塊 SPI 電路(五十九)

DIY - PIC24PIC24FJ64GA008 NOKIA 5110 LCD 模塊 SPI 電路(五十九): 

由於在電路設計時,已經考慮到會使用串列外設介面 (Serial Peripheral Interface,縮寫:SPI)和 I/O 方式,所以要使用 SPI 方式來驅動 NOKIA 5110 PCD8544 LCD 模塊便來得簡單,電路連接是不用改,祇需要更改程式便可以用 SPI 驅動。

PIC24FJ64GA008 NOKIA 5110 LCD 模塊 SPI 電路圖
Microchip PIC24FJ64GA0081.6 NOKIA 5110 LCD 液晶屏連接:
LCD
Signal
Description
I/O Bus
MCU
Signal
1
RST
Reset (Active Low)
11
76
RE0
2
CE
Chip Enable (Active Low)
12
77
RE1
3
DC
Data/Command Selection
Low – Write Commnad
High – Write Data
13
78
RE2
4
DIN
Serial Data Input
19
43
SDO1/RF8
5
CLK
Serial Clock Input
23
45
SCK1/RF6
6
VCC
2.7 ~ 3.3V
1

+3.3V
7
BL
Backlight
15
79
RE3
8
GND
Ground
6

GND

工作原理: 
Philips PCD8544 控制器芯片與 Microchip PIC24FJ64GA008 是採用串列外設介面 (SPISerial Peripheral Interface Bus)連接,而 PCD8544 I/O 控制已經連接到 8腳的連接器,DINData Input Line - Pin 4)接至 MCU SDO1/RF8SPI Data Input 1 / RF8 - Pin 43),CLKSPI Clock Input Line - Pin 5)接至 MCU SCK1/RF6SPI Clock Output 1 /RF6 - Pin 45),RSTReset - Pin 1)接至 MCU PMD0/RE0RE0 - Pin 76),CEChip Enable - Pin 2)接至 MCU PMD1/RE1RE1 - Pin 77),D/CData / Command - Pin 3)接至 MCU PMD2/RE2RE2 - Pin 78),和BLBacklight Control - Pin 7)接至 MCU PMD3/RE3RE3 - Pin 79)。由於 SPI是引腳是可以作 SPI 和一般 I/O使用,所以可試驗 SPI 操作。

Microchip PIC24FJ64GA008 PCD8544 LCD 屏接腳 SPI 程式定義:
// Definitions for Reset pin
#define RST_TRIS_BIT       TRISEbits.TRISE0
#define RST_LAT_BIT        LATEbits.LATE0

// Definitions for CS pin
#define CS_TRIS_BIT        TRISEbits.TRISE1
#define CS_LAT_BIT         LATEbits.LATE1

// Definitions for RS pin
#define RS_TRIS_BIT        TRISEbits.TRISE2
#define RS_LAT_BIT         LATEbits.LATE2

// Definitions for Backlight enable pin
#define LED_TRIS_BIT       TRISEbits.TRISE3 // Output
#define LED_LAT_BIT        LATEbits.LATE3

// Definitions for CLK pin
#define CLK_TRIS_BIT        TRISFbits.TRISF6
#define CLK_LAT_BIT         LATFbits.LATF6

//Definition for data BUS
#define DAT_TRIS_BIT        TRISFbits.TRISF8
#define DAT_LAT_BIT         LATFbits.LATF8
#define DAT_PORT_BIT        PORTFbits.RF8

Microchip PIC24FJ64GA008 PCD8544 LCD SPI 設置程式:
void configSPI1(void) {

SPI1CON1bits.DISSDO = 0;   // bit11 Disable SDOx 1=not used 0=Used
SPI1CON1bits.MODE16 = 0;   // bit10 Word/Byte 1=16bits 0=8bits
SPI1CON1bits.SMP    = 0;   // bit19 SPI Data Input Sample Phase 1=End of data 0=Middle of data
SPI1CON1bits.CKE    = 0;   // bit8 SPI Clock Edge 1=Transition from Active to Idle
SPI1CON1bits.SSEN   = 0;   // bit7 Slave Select Enable 1= SS for Slave 0=not used
SPI1CON1bits.CKP    = 0;   // bit6 Clock Polarity 1=Active=Low, 0=Active=High
SPI1CON1bits.MSTEN  = 1;   // bit5 1=Master, 0=Slave
SPI1CON1bits.SPRE   = 0b111;  // bit2-4 111=1:1 110=2:1
SPI1CON1bits.PPRE   = 0b10;  // bit0-1 11=1:1, 10=4:1, 01=16:1, 00=64:1

SPI1CON2=0;

SPI1STATbits.SPIEN = 1; // Bit15 1=Enable SCK, SDO, SDI, SS

}

Microchip PIC24FJ64GA008 PCD8544 LCD 屏初始化程式:
void nokia_init(void)
{
AD1PCFG = 0xFFFF;
_PMPEN = 0;

// Start Reset Device
// Set I/O as Input=1/Output=0
RST_TRIS_BIT = 0;  // Reset = Output = 0
CS_TRIS_BIT  = 0;  // Chip Select = Output = 0    
RS_TRIS_BIT  = 0;  // Command/Data = Output = 0
DAT_TRIS_BIT = 0;  // Data D0~D7 = Output = 0
CLK_TRIS_BIT = 0;  // SCLK = Output = 0
LED_TRIS_BIT = 0;  // Backlight LED = Output = 0

// Backlight LED ON
LED_LAT_BIT = 1;  // Backlight LED On = 1
RS_LAT_BIT  = 1;  // Data/-Command
CS_LAT_BIT  = 0;  // Chip Select ON = 0  

// Hardward Reset LCD Device
RST_LAT_BIT = 0;  // Reset LCD On = 0 >100ms
delayms(250);
CS_LAT_BIT = 1;   // Chip Select Off = 1
RST_LAT_BIT = 1;  // Reset LCD Off = 1
delayms(200);

nokia_write_command(0x21);   // set extended instruction set
nokia_write_command(0xB1);   // 0x90 was 0xc2  LCD=;3.06+162*0.06=4.02
nokia_write_command(0x04);
nokia_write_command(0x14);   //0x13   bias   1:48 -> n=4
nokia_write_command(0x0C);   //0x13   bias   1:48 -> n=4
nokia_write_command(0x20);   // horiz mode Droite, X autoincremente
delayms(150);
nokia_write_command(0x0C);   // mod control normal change
delayms(50);
CS_LAT_BIT = 1;   // Chip Select Off = 1
}

PIC24FJ64GA008 NOKIA 5110 LCD 模塊 SPI電路試驗
2016年 12月 29日 天氣報告
氣溫:16.2@ 22:20
相對濕度:百分之 51%
天氣:大致多雲

2016年12月28日 星期三

DIY - PIC24:PIC24FJ64GA008 SPI 內部寄存器(五十八)

DIY - PIC24PIC24FJ64GA008 SPI 內部寄存器(五十八): 

Microchip PIC24FJ64GA008 內置的串列外設介面模組(Serial Peripheral Interface,縮寫:SPI),每一個串列外設介面模組都具有 特殊功能寄存器,包括 SPIxBUF(緩衝寄存器)、SPIxSTAT(狀態寄存器)、SPIxCON1(控制寄存器1) 和 SPIxCON2(控制寄存器2

Microchip PIC24FJ64GA008 SPI/ 從連接資料輸送
SPI 串列口的下特殊功能寄存器:
  • SPIxBUFSFR 空間中的位址,用於緩衝待發送資料和已接收資料。該位址由虛擬 SPIxTXB SPIxRXB 寄存器共用。 
  • SPIxCON1 SPIxCON2:用於將模組配置為各種工作模式的控制寄存器。 
  • SPIxSTAT:指示各種狀態條件的狀態寄存器。此外,模組還有一個 16 位元的移位寄存器 SPIxSR,用於從 SPI 埠移入或移出資料。該移位元寄存器未映射到記憶體單元。

PIC24FJ64GA008 SPIxSTAT: SPIx STATUS REGISTER(狀態寄存器)
PIC24FJ64GA008 SPIxSTAT: SPIx STATUS REGISTER(狀態寄存器)
bit
Description
bit 15
SPIENSPIx 使能位
1 = 使能模組並將 SCKxSDOxSDIx SSx 配置為串口引腳
0 = 禁止模組
bit 14
未實現:讀為0
bit 13
SPISIDL:空閒模式停止位元
1 = 當器件進入空閒模式後,模組停止工作。
0 = 在空閒模式下模組繼續工作
bit 12 ~ 11
未實現:讀為0
bit 10 ~ 8
SPIBEC2:SPIBEC0SPIx 緩衝器資料個數位
主控模式:
等待傳輸的 SPI 資料個數
從動模式:
未讀取的 SPI 傳輸資料個數
bit 7
SRMPT:移位寄存器(SPIxSR)空位(在增強型緩衝模式下有效)
1 = SPIx 移位寄存器為空,準備發送或接收
0 = SPIx 移位寄存器非空,讀為 0
bit 6
SPIROV:接收溢出標誌位元
1 = 一個新位元組/ 字已接收並丟棄。由於用戶軟體尚未讀取SPIxBUF 寄存器中已接收的資料。
0 = 沒有發生溢出
bit 5
SRXMPT:接收 FIFO 空位(在增強型緩衝模式下有效)
1 = 接收 FIFO 為空
0 = 接收 FIFO 非空
bit 4 ~ 2
SISEL2:SISEL0SPIx 緩衝區中斷模式位元(在增強型緩衝模式下有效)
111 = SPIx 發送緩衝器滿時產生中斷(SPITBF 位置 1
110 = 最後一位移入SPIxSR 導致發送 FIFO 為空時產生中斷
101 = 最後一位被移出 SPIxSR 時產生中斷,此時發送完成
100 = 有資料移入SPIxSR 導致發送 FIFO 有待發送資料時產生中斷
011 = SPIx 接收緩衝器滿時產生中斷(SPIRBF 位置 1
010 = SPIx 接收緩衝器被填滿 3/4 或更多時產生中斷
001 = 接收緩衝器中有資料時產生中斷(SRMPT 位置 1
000 = 讀取接收緩衝器中的最後一個資料,導致緩衝器為空時產生中斷(SRXMPT 位置 1
bit 1
SPITBFSPIx 發送緩衝器滿狀態位元
1 = 未開始發送, SPIxTXB 滿
0 = 發送開始, SPIxTXB
在標準緩衝器模式下:
CPU 通過寫 SPIxBUF 位址單元裝載 SPIxTXB 時,該位元由硬體自動置1
SPIx 模組將資料從 SPIxTXB 傳輸到 SPIxSR 時,該位元由硬體自動清零。
在增強型緩衝器模式下:
CPU 通過寫 SPIxBUF 位址單元裝載最後一個可用緩衝單元時,該位元由硬體自動置 1
當有空的緩衝器單元可由 CPU 寫入時由硬體自動清零。
bit 0
SPIRBFSPIx 接收緩衝器滿狀態位元
1 = 接收完成, SPIxRXB 滿
0 = 接收未完成, SPIxRXB
在標準緩衝器模式下:
SPIx 將資料從 SPIxSR 傳輸到 SPIxRXB 時,該位元由硬體自動置1
當內核通過讀 SPIxBUF 位址單元讀 SPIxRXB 時,該位元由硬體自動清零。
在增強型緩衝器模式下:
SPIx 將資料從 SPIxSR 傳輸到緩衝器填充了最後一個未讀的緩衝單元時,該位元由硬體自動置 1
當有空的緩衝器單元可接收來自 SPIxSR 的傳輸資料時,該位元由硬體自動清零。

PIC24FJ64GA008 SPIXCON1: SPIx CONTROL REGISTER 1 (控制寄存器1
PIC24FJ64GA008 SPIXCON1: SPIx CONTROL REGISTER 1 (控制寄存器1):
bit
Description
bit 15 ~ 13
未實現:讀為0
bit 12
DISSCKSCKx 引腳禁止位(僅用於 SPI 主控模式)
1 = 禁止內部 SPI 時鐘,引腳用作 I/O
0 = 使能內部 SPI 時鐘
bit 11
DISSDOSDOx 引腳禁止位
1 = 模組不使用 SDOx 引腳,引腳用作 I/O
0 = SDOx 引腳受模組控制
bit 10
MODE16:字 / 位元組通信選擇位元
1 = 每次通信資料為字寬(16 位)
0 = 每次通信資料為位元組寬(8 位元)
bit 9
SMPSPIx 資料登錄採樣點選擇位元
主控模式:
1 = 在資料輸出時間的末尾採樣輸入資料
0 = 在資料輸出時間的中間採樣輸入資料
從動模式:
當在從動模式下使用 SPIx 時,必須將該位清零。
bit 8
CKESPIx 時鐘邊沿選擇位元(1)
1 = 串行輸出資料在時鐘由有效狀態變為空閒狀態時改變(見 bit 6
0 = 串行輸出資料在時鐘由空閒狀態變為有效狀態時改變(見 bit 6
bit 7
SSEN:從動選擇使能(從動模式)位元
1 = SSx 引腳用於從動模式
0 = 模組不使用 SSx 引腳,引腳用作埠。
bit 6
CKP:時鐘極性選擇位元
1 = 時鐘信號空閒狀態為高電平;有效狀態為低電平
0 = 時鐘信號空閒狀態為低電平;有效狀態為高電平
bit 5
MSTEN:主控模式使能位元
1 = 主控模式
0 = 從動模式
bit 4 ~ 2
SPRE2:SPRE0:輔助預分頻比(主控模式)位元
111 = 輔助預分頻比為 1:1
110 = 輔助預分頻比為 2:1
...
000 = 輔助預分頻比為 8:1
bit 1 ~ 0
PPRE1:PPRE0:主預分頻比(主控模式)位元
11 = 主預分頻比為 1:1
10 = 主預分頻比為 4:1
01 = 主預分頻比為 16:1
00 = 主預分頻比為 64:1

PIC24FJ64GA008 SPIxCON2: SPIx CONTROL REGISTER 2 SPIx (控制寄存器2
PIC24FJ64GA008 SPIxCON2: SPIx CONTROL REGISTER 2 SPIx (控制寄存器2):
bit
Description
bit 15
FRMEN:幀 SPIx 支持位
1 = 使能幀 SPIx 支持
0 = 禁止幀 SPIx 支持
bit 14
SPIFSDSSx 引腳上的幀同步脈衝方向控制位
1 = 幀同步脈衝輸入(從動模式)
0 = 幀同步脈衝輸出(主控模式)
bit 13
SPIFPOL:幀同步脈衝極性位元(僅用於幀模式)
1 = 幀同步脈衝高電平有效
0 = 幀同步脈衝低電平有效
bit 12 ~ 2
未實現:讀為0
bit 1
SPIFE:幀同步脈衝邊沿選擇位
1 = 幀同步脈衝與第一位時鐘同步
0 = 幀同步脈衝比第一位時鐘超前
bit 0
SPIBEN:增強型緩衝器使能位
1 = 使能增強型緩衝器
0 = 禁止增強型緩衝器(傳統模式)

Microchip PIC24FJ64GA008 SPI 記憶體映射
在主模式下,輸入SPIx 模組的時鐘為指令週期(TCY) 。然後,由PPRE1:PPRE0SPIxCON1<1:0>)指定的主預分頻器和由 SPRE2:SPRE0 SPIxCON1<4:2>)指定的輔助預分頻器對該時鐘進行預分頻。預分頻後的指令時鐘成為串列時鐘,並通過 SCKx 引腳提供給外部器件。

Microchip PIC24FJ64GA008 SPI 主模式時鐘頻率
2016年 12月 28日 天氣報告
氣溫:17.4@ 17:40
相對濕度:百分之 60%
天氣:多雲