Basic Example / test application for the on-board MICRON QSPI-Flash. Ported from DISCO_L476VG_QSPI. Added printing on serial output and LCD screen.

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG QSPI_DISCO_F746NG TS_DISCO_F746NG mbed

Committer:
capsavon
Date:
Sun Nov 15 14:31:04 2015 +0000
Revision:
4:95cde28a5cf1
Parent:
3:13b323fb08e8
Child:
5:9b9fbd929243
Implementation of the QSPI and Flash SPI IC interface (porting from DISCO-STM32L476VG library).; Implementation of a basic test (init, erase, write, read).; Test passes OK.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
capsavon 2:a655d6640167 1 #include "main.h"
capsavon 2:a655d6640167 2
capsavon 0:742b53764813 3 LCD_DISCO_F746NG lcd;
capsavon 0:742b53764813 4 TS_DISCO_F746NG ts;
capsavon 3:13b323fb08e8 5 DigitalOut myled(LED1);
capsavon 4:95cde28a5cf1 6 QSPI_DISCO_F746NG qspi;
capsavon 0:742b53764813 7
capsavon 4:95cde28a5cf1 8 Serial pc(USBTX, USBRX); // DEBUG
capsavon 2:a655d6640167 9
capsavon 2:a655d6640167 10 // TODO : add Ticker function
capsavon 2:a655d6640167 11
capsavon 0:742b53764813 12 int main()
capsavon 0:742b53764813 13 {
capsavon 0:742b53764813 14 TS_StateTypeDef TS_State;
capsavon 0:742b53764813 15 uint16_t x, y;
capsavon 0:742b53764813 16 uint8_t text[30];
capsavon 0:742b53764813 17 uint8_t status;
capsavon 0:742b53764813 18 uint8_t idx;
capsavon 0:742b53764813 19 uint8_t cleared = 0;
capsavon 0:742b53764813 20 uint8_t prev_nb_touches = 0;
capsavon 0:742b53764813 21
capsavon 0:742b53764813 22 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE);
capsavon 3:13b323fb08e8 23 led_on();
capsavon 2:a655d6640167 24 wait(0.2);
capsavon 0:742b53764813 25
capsavon 0:742b53764813 26 status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
capsavon 0:742b53764813 27 if (status != TS_OK) {
capsavon 0:742b53764813 28 lcd.Clear(LCD_COLOR_RED);
capsavon 0:742b53764813 29 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 0:742b53764813 30 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 0:742b53764813 31 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
capsavon 0:742b53764813 32 } else {
capsavon 0:742b53764813 33 lcd.Clear(LCD_COLOR_GREEN);
capsavon 0:742b53764813 34 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 0:742b53764813 35 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 0:742b53764813 36 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
capsavon 0:742b53764813 37 }
capsavon 0:742b53764813 38
capsavon 2:a655d6640167 39 wait(0.2);
capsavon 0:742b53764813 40 lcd.SetFont(&Font12);
capsavon 0:742b53764813 41 lcd.SetBackColor(LCD_COLOR_BLUE);
capsavon 0:742b53764813 42 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 3:13b323fb08e8 43 led_off();
capsavon 1:7bec6efe01d9 44
capsavon 4:95cde28a5cf1 45 // Check initialization
capsavon 4:95cde28a5cf1 46 QSPI_Info pQSPI_Info;
capsavon 4:95cde28a5cf1 47 uint8_t WriteBuffer[BUFFER_SIZE] = "Hello World !!!";
capsavon 4:95cde28a5cf1 48 uint8_t ReadBuffer[BUFFER_SIZE];
capsavon 4:95cde28a5cf1 49 pc.printf("\n\nQSPI demo started\n\r");
capsavon 4:95cde28a5cf1 50 uint8_t init_return = qspi.Init();
capsavon 4:95cde28a5cf1 51
capsavon 4:95cde28a5cf1 52 pc.printf("Return: %d\n\r", init_return);
capsavon 2:a655d6640167 53
capsavon 4:95cde28a5cf1 54 //if (qspi.Init() != QSPI_OK)
capsavon 4:95cde28a5cf1 55 if (init_return != QSPI_OK)
capsavon 4:95cde28a5cf1 56 {
capsavon 4:95cde28a5cf1 57 //error("QSPI Initialization FAILED\n");
capsavon 4:95cde28a5cf1 58 pc.printf("QSPI Initialization FAILED\n\r");
capsavon 4:95cde28a5cf1 59 lcd.Clear(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 60 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 61 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 62 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI Initialization FAILED", CENTER_MODE);
capsavon 4:95cde28a5cf1 63 }
capsavon 4:95cde28a5cf1 64 else
capsavon 4:95cde28a5cf1 65 {
capsavon 4:95cde28a5cf1 66 pc.printf("QSPI Initialization PASSED\n\r");
capsavon 4:95cde28a5cf1 67 lcd.Clear(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 68 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 69 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 70 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI Initialization PASSED", CENTER_MODE);
capsavon 4:95cde28a5cf1 71 }
capsavon 2:a655d6640167 72
capsavon 4:95cde28a5cf1 73 wait(2);
capsavon 2:a655d6640167 74
capsavon 4:95cde28a5cf1 75 // Check memory informations
capsavon 4:95cde28a5cf1 76 qspi.GetInfo(&pQSPI_Info);
capsavon 4:95cde28a5cf1 77 if ((pQSPI_Info.FlashSize != N25Q128A_FLASH_SIZE) ||
capsavon 4:95cde28a5cf1 78 (pQSPI_Info.EraseSectorSize != N25Q128A_SUBSECTOR_SIZE) ||
capsavon 4:95cde28a5cf1 79 (pQSPI_Info.ProgPageSize != N25Q128A_PAGE_SIZE) ||
capsavon 4:95cde28a5cf1 80 (pQSPI_Info.EraseSectorsNumber != N25Q128A_SUBSECTOR_SIZE) ||
capsavon 4:95cde28a5cf1 81 (pQSPI_Info.ProgPagesNumber != N25Q128A_SECTOR_SIZE))
capsavon 4:95cde28a5cf1 82 {
capsavon 4:95cde28a5cf1 83 //error("QSPI informations FAILED\n");
capsavon 4:95cde28a5cf1 84 pc.printf("QSPI informations FAILED\n\r");
capsavon 4:95cde28a5cf1 85 lcd.Clear(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 86 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 87 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 88 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI informations FAILED", CENTER_MODE);
capsavon 4:95cde28a5cf1 89 }
capsavon 4:95cde28a5cf1 90 else
capsavon 4:95cde28a5cf1 91 {
capsavon 4:95cde28a5cf1 92 //printf("QSPI informations PASSED\n");
capsavon 4:95cde28a5cf1 93 pc.printf("QSPI informations PASSED\n\r");
capsavon 4:95cde28a5cf1 94 lcd.Clear(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 95 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 96 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 97 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI informations PASSED", CENTER_MODE);
capsavon 4:95cde28a5cf1 98 }
capsavon 2:a655d6640167 99
capsavon 4:95cde28a5cf1 100 wait (2);
capsavon 2:a655d6640167 101
capsavon 4:95cde28a5cf1 102 // Erase memory
capsavon 4:95cde28a5cf1 103 if (qspi.Erase_Block(WRITE_READ_ADDR) != QSPI_OK)
capsavon 4:95cde28a5cf1 104 {
capsavon 4:95cde28a5cf1 105 //error("QSPI erase FAILED\n");
capsavon 4:95cde28a5cf1 106 pc.printf("QSPI erase FAILED\n\r");
capsavon 4:95cde28a5cf1 107 lcd.Clear(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 108 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 109 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 110 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI erase FAILED", CENTER_MODE);
capsavon 4:95cde28a5cf1 111 }
capsavon 4:95cde28a5cf1 112 else
capsavon 4:95cde28a5cf1 113 {
capsavon 4:95cde28a5cf1 114 //printf("QSPI erase PASSED\n");
capsavon 4:95cde28a5cf1 115 pc.printf("QSPI erase PASSED\n\r");
capsavon 4:95cde28a5cf1 116 lcd.Clear(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 117 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 118 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 119 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI erase PASSED", CENTER_MODE);
capsavon 4:95cde28a5cf1 120 }
capsavon 2:a655d6640167 121
capsavon 4:95cde28a5cf1 122 wait (2);
capsavon 2:a655d6640167 123
capsavon 4:95cde28a5cf1 124 // Write memory
capsavon 4:95cde28a5cf1 125 if (qspi.Write(WriteBuffer, WRITE_READ_ADDR, 15) != QSPI_OK)
capsavon 4:95cde28a5cf1 126 {
capsavon 4:95cde28a5cf1 127 //error("QSPI write FAILED\n");
capsavon 4:95cde28a5cf1 128 pc.printf("QSPI write FAILED\n\r");
capsavon 4:95cde28a5cf1 129 lcd.Clear(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 130 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 131 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 132 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI write FAILED", CENTER_MODE);
capsavon 4:95cde28a5cf1 133 }
capsavon 4:95cde28a5cf1 134 else
capsavon 4:95cde28a5cf1 135 {
capsavon 4:95cde28a5cf1 136 //printf("QSPI write PASSED\n");
capsavon 4:95cde28a5cf1 137 pc.printf("QSPI write PASSED\n\r");
capsavon 4:95cde28a5cf1 138 lcd.Clear(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 139 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 140 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 141 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI write PASSED", CENTER_MODE);
capsavon 4:95cde28a5cf1 142 }
capsavon 4:95cde28a5cf1 143
capsavon 4:95cde28a5cf1 144 wait (2);
capsavon 2:a655d6640167 145
capsavon 4:95cde28a5cf1 146 // Read memory
capsavon 4:95cde28a5cf1 147 if (qspi.Read(ReadBuffer, WRITE_READ_ADDR, 11) != QSPI_OK)
capsavon 4:95cde28a5cf1 148 {
capsavon 4:95cde28a5cf1 149 //error("QSPI read FAILED\n");
capsavon 4:95cde28a5cf1 150 pc.printf("QSPI read FAILED\n\r");
capsavon 4:95cde28a5cf1 151 lcd.Clear(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 152 lcd.SetBackColor(LCD_COLOR_RED);
capsavon 4:95cde28a5cf1 153 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 154 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI read FAILED", CENTER_MODE);
capsavon 4:95cde28a5cf1 155 }
capsavon 4:95cde28a5cf1 156 else
capsavon 4:95cde28a5cf1 157 {
capsavon 4:95cde28a5cf1 158 //printf("QSPI read PASSED - [%s]\n", ReadBuffer);
capsavon 4:95cde28a5cf1 159 pc.printf("QSPI read PASSED\n\r");
capsavon 4:95cde28a5cf1 160 lcd.Clear(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 161 lcd.SetBackColor(LCD_COLOR_GREEN);
capsavon 4:95cde28a5cf1 162 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 4:95cde28a5cf1 163 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"QSPI read PASSED", CENTER_MODE);
capsavon 4:95cde28a5cf1 164 }
capsavon 2:a655d6640167 165
capsavon 4:95cde28a5cf1 166 wait (2);
capsavon 4:95cde28a5cf1 167
capsavon 2:a655d6640167 168
capsavon 0:742b53764813 169 while(1) {
capsavon 2:a655d6640167 170
capsavon 2:a655d6640167 171 lcd.SetBackColor(LCD_COLOR_BLUE);
capsavon 2:a655d6640167 172 lcd.SetTextColor(LCD_COLOR_WHITE);
capsavon 0:742b53764813 173
capsavon 0:742b53764813 174 ts.GetState(&TS_State);
capsavon 0:742b53764813 175 if (TS_State.touchDetected) {
capsavon 0:742b53764813 176 // Clear lines corresponding to old touches coordinates
capsavon 0:742b53764813 177 if (TS_State.touchDetected < prev_nb_touches) {
capsavon 0:742b53764813 178 for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
capsavon 0:742b53764813 179 lcd.ClearStringLine(idx);
capsavon 0:742b53764813 180 }
capsavon 0:742b53764813 181 }
capsavon 0:742b53764813 182 prev_nb_touches = TS_State.touchDetected;
capsavon 0:742b53764813 183
capsavon 0:742b53764813 184 cleared = 0;
capsavon 0:742b53764813 185
capsavon 0:742b53764813 186 sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
capsavon 0:742b53764813 187 lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
capsavon 0:742b53764813 188
capsavon 0:742b53764813 189 for (idx = 0; idx < TS_State.touchDetected; idx++) {
capsavon 0:742b53764813 190 x = TS_State.touchX[idx];
capsavon 0:742b53764813 191 y = TS_State.touchY[idx];
capsavon 0:742b53764813 192 sprintf((char*)text, "Touch %d: x=%d y=%d ", idx+1, x, y);
capsavon 0:742b53764813 193 lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
capsavon 1:7bec6efe01d9 194
capsavon 0:742b53764813 195 }
capsavon 0:742b53764813 196
capsavon 0:742b53764813 197 lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
capsavon 1:7bec6efe01d9 198
capsavon 0:742b53764813 199 } else {
capsavon 0:742b53764813 200 if (!cleared) {
capsavon 0:742b53764813 201 lcd.Clear(LCD_COLOR_BLUE);
capsavon 0:742b53764813 202 sprintf((char*)text, "Touches: 0");
capsavon 0:742b53764813 203 lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
capsavon 1:7bec6efe01d9 204
capsavon 0:742b53764813 205 cleared = 1;
capsavon 0:742b53764813 206 }
capsavon 0:742b53764813 207 }
capsavon 2:a655d6640167 208
capsavon 4:95cde28a5cf1 209
capsavon 2:a655d6640167 210 // Touch detection of one button
capsavon 2:a655d6640167 211 if (TS_State.touchDetected > 0) {
capsavon 2:a655d6640167 212 }
capsavon 2:a655d6640167 213 else {
capsavon 2:a655d6640167 214 }
capsavon 0:742b53764813 215 }
capsavon 0:742b53764813 216 }
capsavon 1:7bec6efe01d9 217
capsavon 2:a655d6640167 218
capsavon 3:13b323fb08e8 219 // Functions definition
capsavon 3:13b323fb08e8 220 void led_power (int state) {
capsavon 3:13b323fb08e8 221 myled = state;
capsavon 3:13b323fb08e8 222 }
capsavon 3:13b323fb08e8 223
capsavon 3:13b323fb08e8 224 void led_on (void) {
capsavon 3:13b323fb08e8 225 led_power(1);
capsavon 3:13b323fb08e8 226 }
capsavon 3:13b323fb08e8 227
capsavon 3:13b323fb08e8 228 void led_off (void) {
capsavon 3:13b323fb08e8 229 led_power(0);
capsavon 3:13b323fb08e8 230 }
capsavon 3:13b323fb08e8 231
capsavon 3:13b323fb08e8 232 void led_toggle (void) {
capsavon 3:13b323fb08e8 233 static int toggle = 0;
capsavon 3:13b323fb08e8 234 if (toggle) {
capsavon 3:13b323fb08e8 235 led_on();
capsavon 3:13b323fb08e8 236 toggle = 0;
capsavon 3:13b323fb08e8 237 }
capsavon 3:13b323fb08e8 238 else {
capsavon 3:13b323fb08e8 239 led_off();
capsavon 3:13b323fb08e8 240 toggle = 1;
capsavon 3:13b323fb08e8 241 }
capsavon 3:13b323fb08e8 242 }
capsavon 2:a655d6640167 243
capsavon 2:a655d6640167 244