92 lines
4.6 KiB
Markdown
92 lines
4.6 KiB
Markdown
|
## 06 LCD
|
||
|
|
||
|
The special function register `LCD` memory mapped to addresses 4104 and 4105 enables HACK to write bytes to the LCD controller chip ILI9341V situated on MOD-LCD2.8RTP. The communication protocol is SPI with one additional wire DCX. The protocol defines transmission of 8 bit commands with DCX = 0 followed data with DCX=1. Data packets can have any length depending on the launched command.
|
||
|
|
||
|
### Chip specification
|
||
|
|
||
|
| IN/OUT | wire | function |
|
||
|
| ------ | ------- | -------------------------------------------------- |
|
||
|
| IN | in[7:0] | byte to be sent. |
|
||
|
| IN | in[8] | =0 send byte and set CSX low |
|
||
|
| IN | in[8] | =1 pull CSX high without sending byte |
|
||
|
| IN | in[9] | value of DCX when transmitting a byte. |
|
||
|
| IN | load | initiates the transmission of a byte, when in[8]=0 |
|
||
|
| IN | load16 | initiates the transmission of 16 bit in[15:0] |
|
||
|
| OUT | out[15] | =0 chip is busy, =0 ready |
|
||
|
| OUT | DCX | =0 command, =1 data |
|
||
|
| OUT | SDO | serial data out |
|
||
|
| OUT | SCK | serial clock |
|
||
|
| OUT | CSX | chip select not |
|
||
|
|
||
|
The special function register `LCD` communicates with ILI9341V LCD controller over 4 wire SPI.
|
||
|
|
||
|
When load=1 and in[8]=0 transmission of byte in[7:0] is initiated. CSX is goes low (and stays low even when transmission is completed). DCX is set to in[9]. The byte in[7:0] is send to SDO bitwise together with 8 clock signals on SCK. During transmission out[15] is 1. After 16 clock cycles transmission is completed and out[15] is set to 0.
|
||
|
|
||
|
When load=1 and in[8]=1 CSX goes high and DCX=in[9] without transmission of any bit.
|
||
|
|
||
|
When load16=1 transmission of word in[15:0] is initiated. CSX is goes low (and stays low even when transmission is completed). DCX is set to 1 (data). After 32 clock cycles transmission is completed and out[15] is set to 0.
|
||
|
|
||
|
### Proposed Implementation
|
||
|
|
||
|
Use a `Bit` to store the state (0 = ready, 1 = busy) which is output to out[15]. Another two `Bit` store the state of DCX and CSX. Use a counter `PC` to count from 0 to 15 or 31 according to load/load16. Finally we need two connected `BitShift8L`. They will be loaded with the byte in[7:0] or the word in[15:0] to be send. After 8/16 bits are transmitted the module cleares out[15].
|
||
|
|
||
|
![](LCD.png)
|
||
|
|
||
|
### Memory map
|
||
|
|
||
|
The special function register `LCD` is mapped to memory map of HACK according to:
|
||
|
|
||
|
| address | I/O device | R/W | function |
|
||
|
| --------- | ---------- | --- | ----------------------------------- |
|
||
|
| 4104 | LCD | W | start transmittion of byte in[7:0] |
|
||
|
| 4105 | LCD | W | start transmittion of word in[15:0] |
|
||
|
| 4104/4105 | LCD | R | out[15]=1 busy, out[15]=0 idle |
|
||
|
|
||
|
### LCD in real hardware
|
||
|
|
||
|
The board MO-LCD2.8RTP comes with a 2.8 inch LCD screen controlled by a controller chip ILI8341V. MOD-LCD2.8RTP must be connected to iCE40HX1K-EVB with 6 jumper wire cables: +3.3V, GND plus 4 data wires according to `iCE40HX1K-EVB.pcf` (Compare with schematic [iCE40HX1K_EVB](../../doc/iCE40HX1K-EVB_Rev_B.pdf) and [MOD-LCD2.8RTP_RevB.pdf](../../doc/MOD-LCD2.8RTP_RevB.pdf).
|
||
|
|
||
|
```
|
||
|
set_io LCD_DCX 1 # PIO3_1A connected to pin 5 of GPIO1
|
||
|
set_io LCD_SDO 2 # PIO3_1B connected to pin 7 of GPIO1
|
||
|
set_io LCD_SCK 3 # PIO3_2A connected to pin 9 of GPIO1
|
||
|
set_io LCD_CSX 4 # PIO3_2B connected to pin 11 of GPIO1
|
||
|
```
|
||
|
|
||
|
| wire | iCE40HX1K-EVB (GPIO1) | MOD-LCD2.8RTP (UEXT) |
|
||
|
| ------- | --------------------- | -------------------- |
|
||
|
| +3.3V | 3 | 1 +3.3V |
|
||
|
| GND | 4 | 2 GND |
|
||
|
| LCD_DCX | 5 | 7 D/C |
|
||
|
| LCD_SDO | 7 | 8 MOSI |
|
||
|
| LCD_SCK | 9 | 9 SCK |
|
||
|
| LCD_CSX | 11 | 11 CS |
|
||
|
|
||
|
***
|
||
|
|
||
|
### Project
|
||
|
|
||
|
* Implement `LCD.v` and test with testbench:
|
||
|
|
||
|
```
|
||
|
$ cd 06_LCD
|
||
|
$ apio clean
|
||
|
$ apio sim
|
||
|
```
|
||
|
|
||
|
* Compare output `OUT` of special chip`LCD` with `CMP`.
|
||
|
|
||
|
![](LCD_tb.png)
|
||
|
|
||
|
* Add special function register`LCD` to `HACK` at memory addresses 4104/4105 and upload to iCE40HX1K-EVB with the bootloader boot.asm preloaded into ROM
|
||
|
|
||
|
```
|
||
|
$ cd ../05_GO
|
||
|
$ make
|
||
|
$ cd ../00_HACK
|
||
|
$ apio clean
|
||
|
$ apio upload
|
||
|
```
|
||
|
|
||
|
* Proceed to `07_Operating_System` and implement the driver class `Screen.jack` that sends command over `LCD` the controller chip ILI9341V on MOD-LCD2.8RTP
|