max32630fthr quad spi , unexpected spi behavior

Committer:
boonshen
Date:
Tue Mar 13 21:12:00 2018 +0000
Revision:
0:a35c40f49345
MAX32630FTHR QuadSPI test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
boonshen 0:a35c40f49345 1 /***** Includes *****/
boonshen 0:a35c40f49345 2 #include "mbed.h"
boonshen 0:a35c40f49345 3 #include "max32630fthr.h"
boonshen 0:a35c40f49345 4 #include "USBSerial.h"
boonshen 0:a35c40f49345 5
boonshen 0:a35c40f49345 6 #include "gpio.h"
boonshen 0:a35c40f49345 7 #include "mxc_config.h"
boonshen 0:a35c40f49345 8 #include "clkman.h"
boonshen 0:a35c40f49345 9 #include "ioman.h"
boonshen 0:a35c40f49345 10 #include "spim.h"
boonshen 0:a35c40f49345 11 #include "spis.h"
boonshen 0:a35c40f49345 12
boonshen 0:a35c40f49345 13 /***** Globals *****/
boonshen 0:a35c40f49345 14
boonshen 0:a35c40f49345 15 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
boonshen 0:a35c40f49345 16 uint8_t spiwidth = 0;
boonshen 0:a35c40f49345 17
boonshen 0:a35c40f49345 18 // Hardware serial port over DAPLink
boonshen 0:a35c40f49345 19 Serial daplink(P2_1, P2_0);
boonshen 0:a35c40f49345 20
boonshen 0:a35c40f49345 21 // Virtual serial port over USB
boonshen 0:a35c40f49345 22 USBSerial microUSB;
boonshen 0:a35c40f49345 23
boonshen 0:a35c40f49345 24 DigitalOut rLED(LED1);
boonshen 0:a35c40f49345 25 DigitalOut gLED(LED2);
boonshen 0:a35c40f49345 26 DigitalOut bLED(LED3);
boonshen 0:a35c40f49345 27
boonshen 0:a35c40f49345 28
boonshen 0:a35c40f49345 29
boonshen 0:a35c40f49345 30 /***** Functions *****/
boonshen 0:a35c40f49345 31
boonshen 0:a35c40f49345 32 union spisRXcontainer32 {
boonshen 0:a35c40f49345 33 uint8_t rx8[4];
boonshen 0:a35c40f49345 34 uint32_t rx32;
boonshen 0:a35c40f49345 35 };
boonshen 0:a35c40f49345 36
boonshen 0:a35c40f49345 37 uint32_t spis_read_quad32bit() {
boonshen 0:a35c40f49345 38 spisRXcontainer32 rxbuf;
boonshen 0:a35c40f49345 39
boonshen 0:a35c40f49345 40 spis_req_t req;
boonshen 0:a35c40f49345 41
boonshen 0:a35c40f49345 42 req.len = 4;
boonshen 0:a35c40f49345 43 req.width = SPIS_WIDTH_4;
boonshen 0:a35c40f49345 44 req.tx_data = NULL;
boonshen 0:a35c40f49345 45 req.rx_data = rxbuf.rx8;
boonshen 0:a35c40f49345 46 req.deass = 0;
boonshen 0:a35c40f49345 47
boonshen 0:a35c40f49345 48 SPIS_Trans(MXC_SPIS, &req);
boonshen 0:a35c40f49345 49
boonshen 0:a35c40f49345 50 return rxbuf.rx32;
boonshen 0:a35c40f49345 51 }
boonshen 0:a35c40f49345 52
boonshen 0:a35c40f49345 53 uint8_t spis_read_8bit() {
boonshen 0:a35c40f49345 54 uint8_t rxbuf;
boonshen 0:a35c40f49345 55
boonshen 0:a35c40f49345 56 spis_req_t req;
boonshen 0:a35c40f49345 57
boonshen 0:a35c40f49345 58 req.len = 1;
boonshen 0:a35c40f49345 59 req.width = SPIS_WIDTH_4;
boonshen 0:a35c40f49345 60 req.tx_data = NULL;
boonshen 0:a35c40f49345 61 req.rx_data = &rxbuf;
boonshen 0:a35c40f49345 62 req.deass = 0;
boonshen 0:a35c40f49345 63
boonshen 0:a35c40f49345 64 SPIS_Trans(MXC_SPIS, &req);
boonshen 0:a35c40f49345 65
boonshen 0:a35c40f49345 66 return rxbuf;
boonshen 0:a35c40f49345 67 }
boonshen 0:a35c40f49345 68
boonshen 0:a35c40f49345 69
boonshen 0:a35c40f49345 70 void spis_config() {
boonshen 0:a35c40f49345 71 //fthr extra, set shared pin to high Z input
boonshen 0:a35c40f49345 72 gpio_cfg_t gpio_cfg;
boonshen 0:a35c40f49345 73 gpio_cfg.port = 5;
boonshen 0:a35c40f49345 74 gpio_cfg.mask = PIN_0 | PIN_1 | PIN_2 | PIN_3 | PIN_4 | PIN_5;
boonshen 0:a35c40f49345 75 gpio_cfg.func = GPIO_FUNC_GPIO;
boonshen 0:a35c40f49345 76 gpio_cfg.pad= GPIO_PAD_INPUT;
boonshen 0:a35c40f49345 77 GPIO_Config(&gpio_cfg);
boonshen 0:a35c40f49345 78
boonshen 0:a35c40f49345 79 int error;
boonshen 0:a35c40f49345 80 uint8_t spis_mode = 0;
boonshen 0:a35c40f49345 81 sys_cfg_spis_t sys_cfg;
boonshen 0:a35c40f49345 82
boonshen 0:a35c40f49345 83 //IO Config req pin, core I/O, quad, fast usr manual pg333
boonshen 0:a35c40f49345 84 sys_cfg.io_cfg = IOMAN_SPIS(0, 1, 1, 1);
boonshen 0:a35c40f49345 85 sys_cfg.clk_scale = CLKMAN_SCALE_AUTO;
boonshen 0:a35c40f49345 86
boonshen 0:a35c40f49345 87
boonshen 0:a35c40f49345 88 if((error = SPIS_Init(MXC_SPIS, spis_mode, &sys_cfg)) != E_NO_ERROR) {
boonshen 0:a35c40f49345 89 microUSB.printf("Error initializing SPIS %d\n", error);
boonshen 0:a35c40f49345 90 while(1) {}
boonshen 0:a35c40f49345 91 } else {
boonshen 0:a35c40f49345 92 microUSB.printf("SPIS Initialized, SPIS Clock speed %d\n", SYS_SPIS_GetFreq());
boonshen 0:a35c40f49345 93
boonshen 0:a35c40f49345 94 //Maxim SDK doesn't provide init function to set spis quad mode
boonshen 0:a35c40f49345 95 spiwidth = MXC_SPIS->gen_ctrl & 0b00110000; //bits location 5:4
boonshen 0:a35c40f49345 96 daplink.printf("initial spi width mode: %d\r\n", (spiwidth >> 4) );
boonshen 0:a35c40f49345 97
boonshen 0:a35c40f49345 98 MXC_SPIS->gen_ctrl &= ~(1UL << 4); //set quad
boonshen 0:a35c40f49345 99 MXC_SPIS->gen_ctrl |= 1UL << 5;
boonshen 0:a35c40f49345 100
boonshen 0:a35c40f49345 101 spiwidth = MXC_SPIS->gen_ctrl & 0b00110000; //bits location 5:4
boonshen 0:a35c40f49345 102 daplink.printf("set spi width mode : %d\r\n", (spiwidth >> 4) );
boonshen 0:a35c40f49345 103
boonshen 0:a35c40f49345 104 }
boonshen 0:a35c40f49345 105 };
boonshen 0:a35c40f49345 106
boonshen 0:a35c40f49345 107
boonshen 0:a35c40f49345 108
boonshen 0:a35c40f49345 109 // *****************************************************************************
boonshen 0:a35c40f49345 110 // main() runs in its own thread in the OS
boonshen 0:a35c40f49345 111 // (note the calls to Thread::wait below for delays)
boonshen 0:a35c40f49345 112 int main()
boonshen 0:a35c40f49345 113 {
boonshen 0:a35c40f49345 114 daplink.printf("daplink serial port\r\n");
boonshen 0:a35c40f49345 115 microUSB.printf("micro USB serial port\r\n");
boonshen 0:a35c40f49345 116
boonshen 0:a35c40f49345 117 rLED = LED_ON;
boonshen 0:a35c40f49345 118 gLED = LED_ON;
boonshen 0:a35c40f49345 119 bLED = LED_OFF;
boonshen 0:a35c40f49345 120
boonshen 0:a35c40f49345 121 rLED = LED_OFF;
boonshen 0:a35c40f49345 122
boonshen 0:a35c40f49345 123 //c = microUSB.getc();
boonshen 0:a35c40f49345 124 spis_config();
boonshen 0:a35c40f49345 125
boonshen 0:a35c40f49345 126
boonshen 0:a35c40f49345 127 uint8_t readSpi8[8];
boonshen 0:a35c40f49345 128 uint32_t readSpi32[8];
boonshen 0:a35c40f49345 129
boonshen 0:a35c40f49345 130 uint8_t spiRxAvail;
boonshen 0:a35c40f49345 131
boonshen 0:a35c40f49345 132 spiRxAvail = SPIS_NumReadAvail(MXC_SPIS);
boonshen 0:a35c40f49345 133 daplink.printf("buf avail:%d\r\n", spiRxAvail);
boonshen 0:a35c40f49345 134
boonshen 0:a35c40f49345 135 while(1) {
boonshen 0:a35c40f49345 136
boonshen 0:a35c40f49345 137 if( (spiwidth<<4) == 0) {
boonshen 0:a35c40f49345 138 //4-wire mode
boonshen 0:a35c40f49345 139 while( SPIS_NumReadAvail(MXC_SPIS) < 8 ) {};
boonshen 0:a35c40f49345 140
boonshen 0:a35c40f49345 141 for (int i = 0; i< 8; i++){
boonshen 0:a35c40f49345 142 readSpi8[i] = spis_read_8bit();
boonshen 0:a35c40f49345 143 }
boonshen 0:a35c40f49345 144
boonshen 0:a35c40f49345 145 for (int i = 0; i< 8; i++){
boonshen 0:a35c40f49345 146 daplink.printf("spi read : 0x%08x\r\n", readSpi8[i]);
boonshen 0:a35c40f49345 147 }
boonshen 0:a35c40f49345 148
boonshen 0:a35c40f49345 149 }
boonshen 0:a35c40f49345 150
boonshen 0:a35c40f49345 151 if( (spiwidth<<4) == 2) {
boonshen 0:a35c40f49345 152 //6-wire (quad) mode
boonshen 0:a35c40f49345 153
boonshen 0:a35c40f49345 154 while( SPIS_NumReadAvail(MXC_SPIS) < 4 * 8 ) {};
boonshen 0:a35c40f49345 155
boonshen 0:a35c40f49345 156 for (int i = 0; i< 8; i++){
boonshen 0:a35c40f49345 157 readSpi32[i] = spis_read_quad32bit();
boonshen 0:a35c40f49345 158 }
boonshen 0:a35c40f49345 159 for (int i = 0; i< 8; i++){
boonshen 0:a35c40f49345 160 daplink.printf("spi read : 0x%08x\r\n", readSpi32[i]);
boonshen 0:a35c40f49345 161 }
boonshen 0:a35c40f49345 162
boonshen 0:a35c40f49345 163 }
boonshen 0:a35c40f49345 164
boonshen 0:a35c40f49345 165 spiRxAvail = SPIS_NumReadAvail(MXC_SPIS);
boonshen 0:a35c40f49345 166 daplink.printf("buf left:%d\r\n", spiRxAvail);
boonshen 0:a35c40f49345 167
boonshen 0:a35c40f49345 168 }
boonshen 0:a35c40f49345 169
boonshen 0:a35c40f49345 170
boonshen 0:a35c40f49345 171
boonshen 0:a35c40f49345 172 }
boonshen 0:a35c40f49345 173