nand2/06_IO_Devices/06_LCD/Readme.md
Michael Schröder 971b323822 added v2.0
2023-01-11 23:04:57 +01:00

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