Dependencies:   mbed

Committer:
BenRJG
Date:
Sun Apr 01 16:22:36 2018 +0000
Revision:
3:d6e142b6ead1
Parent:
2:b615682e3e4f
Child:
4:bcef9164776e
Created Chip Select Bus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BenRJG 1:acc66d3a1a1c 1 #include "SPI.h"
BenRJG 1:acc66d3a1a1c 2
BenRJG 1:acc66d3a1a1c 3 SPI spi(PA_7, PA_6, PA_5); // Ordered as: mosi, miso, sclk could use forth parameter ssel
BenRJG 1:acc66d3a1a1c 4 // However using multi SPI devices within FPGA with a seperate chip select
BenRJG 1:acc66d3a1a1c 5 SPI spi_cmd(PA_7, PA_6, PA_5); // NB another instance call spi_cmd for 8 bit SPI dataframe see later line 37
BenRJG 1:acc66d3a1a1c 6 // For each device NB PA_7 PA_6 PA_5 are D11 D12 D13 respectively
BenRJG 3:d6e142b6ead1 7
BenRJG 3:d6e142b6ead1 8 //DigitalOut LED_cs(PC_6); // Chip Select for Basic Outputs to illuminate Onboard FPGA DEO nano LEDs CN7 pin 1
BenRJG 3:d6e142b6ead1 9 //DigitalOut LCD_cs(PB_15); // Chip Select for the LCD via FPGA CN7 pin 3
BenRJG 3:d6e142b6ead1 10 //DigitalOut ADC_cs(PB_9); // Chip Select for the ADC via FPGA CN7 pin 4
BenRJG 3:d6e142b6ead1 11
BenRJG 3:d6e142b6ead1 12 BusOut cs(PB_9,PB_15,PC_6); // Chip Select => 111(7) = Nothing, 110(6) = General, 101(5) = LCD, 011(3) = ADC
BenRJG 1:acc66d3a1a1c 13
BenRJG 1:acc66d3a1a1c 14 //NBB the following line for F429ZI !!!!
BenRJG 1:acc66d3a1a1c 15 DigitalIn DO_NOT_USE(PB_12); // MAKE PB_12 (D19) an INPUT do NOT make an OUTPUT under any circumstances !!!!! ************* !!!!!!!!!!!
BenRJG 1:acc66d3a1a1c 16 // This Pin is connected to the 5VDC from the FPGA card and an INPUT is 5V Tolerant
BenRJG 1:acc66d3a1a1c 17
BenRJG 2:b615682e3e4f 18 int adval_d; //A to D value read back
BenRJG 2:b615682e3e4f 19 float adval_f;
BenRJG 2:b615682e3e4f 20 int err; //error variable used for debugging, trapping etc.,
BenRJG 2:b615682e3e4f 21
BenRJG 2:b615682e3e4f 22 char adval[32];
BenRJG 1:acc66d3a1a1c 23 //Ticker ticktock;
BenRJG 2:b615682e3e4f 24 void SPI_INIT (void)
BenRJG 2:b615682e3e4f 25 {
BenRJG 3:d6e142b6ead1 26 LED_cs = 1; // Chip must be deselected, Chip Select is active LOW
BenRJG 2:b615682e3e4f 27 LCD_cs = 1; // Chip must be deselected, Chip Select is active LOW
BenRJG 2:b615682e3e4f 28 ADC_cs = 1; // Chip must be deselected, Chip Select is active LOW
BenRJG 3:d6e142b6ead1 29
BenRJG 2:b615682e3e4f 30 spi.format(16,0); // Setup the DATA frame SPI for 16 bit wide word, Clock Polarity 0 and Clock Phase 0 (0)
BenRJG 2:b615682e3e4f 31 spi_cmd.format(8,0); // Setup the COMMAND SPI as 8 Bit wide word, Clock Polarity 0 and Clock Phase 0 (0)
BenRJG 2:b615682e3e4f 32 spi.frequency(1000000); // 1MHz clock rate
BenRJG 2:b615682e3e4f 33 spi_cmd.frequency(1000000); // 1MHz clock rate
BenRJG 2:b615682e3e4f 34
BenRJG 2:b615682e3e4f 35 adval_d = 0; //A to D value read back
BenRJG 2:b615682e3e4f 36 adval_f =0.0f;
BenRJG 2:b615682e3e4f 37 err = 0; //error variable used for debugging, trapping etc.,
BenRJG 2:b615682e3e4f 38
BenRJG 2:b615682e3e4f 39 // Preload some arrays
BenRJG 2:b615682e3e4f 40 // char hello_world[]="Hello World";
BenRJG 2:b615682e3e4f 41 char splash_screen1[]="Martin Simpson";
BenRJG 2:b615682e3e4f 42 char splash_screen2[]="Plymouth UNI";
BenRJG 2:b615682e3e4f 43 char DVM[]="Voltage=";
BenRJG 2:b615682e3e4f 44 // Start up sequences
BenRJG 2:b615682e3e4f 45 lcd_cls();
BenRJG 2:b615682e3e4f 46 lcd_locate(1,1);
BenRJG 2:b615682e3e4f 47 lcd_display(splash_screen1); //Credit line 1
BenRJG 2:b615682e3e4f 48 lcd_locate(2,2);
BenRJG 2:b615682e3e4f 49 lcd_display(splash_screen2); //Credit line 2
BenRJG 2:b615682e3e4f 50 wait(2);
BenRJG 2:b615682e3e4f 51 lcd_cls();
BenRJG 2:b615682e3e4f 52 pulse_bar_graph(); //Flashy bargraph clear screen
BenRJG 2:b615682e3e4f 53 lcd_locate(1,0);
BenRJG 2:b615682e3e4f 54 lcd_display(DVM); //Type Voltage display
BenRJG 2:b615682e3e4f 55 lcd_locate(1,13);
BenRJG 2:b615682e3e4f 56 lcd_display("V"); //Units display
BenRJG 2:b615682e3e4f 57 }
BenRJG 1:acc66d3a1a1c 58
BenRJG 2:b615682e3e4f 59 void SPI_TEST(void)
BenRJG 2:b615682e3e4f 60 {
BenRJG 2:b615682e3e4f 61 adval_d = read_adc();
BenRJG 2:b615682e3e4f 62
BenRJG 2:b615682e3e4f 63 adval_f = 3.3f*((float)adval_d/4095);//Convert 12 bit to a float and scale
BenRJG 2:b615682e3e4f 64 sprintf(adval,"%.3f",adval_f); //Store in an array string
BenRJG 2:b615682e3e4f 65 lcd_locate(1,8); //and display on LCD
BenRJG 2:b615682e3e4f 66 lcd_display(adval); //
BenRJG 2:b615682e3e4f 67
BenRJG 2:b615682e3e4f 68 err = bar_graph(adval_d/255); // 16*256 =4096 12 bit ADC!
BenRJG 2:b615682e3e4f 69 if (err < 0){printf("Display Overload\r\n");}
BenRJG 2:b615682e3e4f 70
BenRJG 2:b615682e3e4f 71 read_switches();
BenRJG 2:b615682e3e4f 72 //LED Chaser display KIT lives on!
BenRJG 2:b615682e3e4f 73 for (uint32_t i=1;i<=128;i*=2)
BenRJG 2:b615682e3e4f 74 {
BenRJG 3:d6e142b6ead1 75 LED_cs = 0; //Select the device by seting chip select LOW
BenRJG 2:b615682e3e4f 76 spi_cmd.write(0);
BenRJG 2:b615682e3e4f 77 spi.write(i);
BenRJG 3:d6e142b6ead1 78 LED_cs = 1; //De-Select the device by seting chip select HIGH
BenRJG 2:b615682e3e4f 79 wait_ms(20);
BenRJG 2:b615682e3e4f 80 }
BenRJG 2:b615682e3e4f 81 for (uint32_t i=128;i>=1;i/=2)
BenRJG 2:b615682e3e4f 82 {
BenRJG 3:d6e142b6ead1 83 LED_cs = 0; //Select the device by seting chip select LOW
BenRJG 2:b615682e3e4f 84 spi_cmd.write(0);
BenRJG 2:b615682e3e4f 85 spi.write(i);
BenRJG 3:d6e142b6ead1 86 LED_cs = 1; //De-Select the device by seting chip select HIGH
BenRJG 2:b615682e3e4f 87 wait_ms(20);
BenRJG 2:b615682e3e4f 88 }
BenRJG 2:b615682e3e4f 89 }
BenRJG 1:acc66d3a1a1c 90
BenRJG 1:acc66d3a1a1c 91 int lcd_cls(void){
BenRJG 1:acc66d3a1a1c 92 LCD_cs = 0;spi_cmd.write(0);spi.write(0x0001);LCD_cs = 1;wait_us(CD); //Clear Screen
BenRJG 1:acc66d3a1a1c 93 return 0;
BenRJG 1:acc66d3a1a1c 94 }
BenRJG 1:acc66d3a1a1c 95
BenRJG 1:acc66d3a1a1c 96 int lcd_locate(uint8_t line, uint8_t column){
BenRJG 1:acc66d3a1a1c 97 uint8_t line_addr;
BenRJG 1:acc66d3a1a1c 98 uint8_t column_addr;
BenRJG 1:acc66d3a1a1c 99 switch(line){
BenRJG 1:acc66d3a1a1c 100 case 1: line_addr=0x80; break;
BenRJG 1:acc66d3a1a1c 101 case 2: line_addr=0xC0; break;
BenRJG 1:acc66d3a1a1c 102 default: return -1; //return code !=0 is error
BenRJG 1:acc66d3a1a1c 103 }
BenRJG 1:acc66d3a1a1c 104 if(column<16){column_addr=column;}
BenRJG 1:acc66d3a1a1c 105 else{return -1;}
BenRJG 1:acc66d3a1a1c 106 LCD_cs = 0;
BenRJG 1:acc66d3a1a1c 107 spi_cmd.write(0);
BenRJG 1:acc66d3a1a1c 108 spi.write(line_addr+column_addr);
BenRJG 1:acc66d3a1a1c 109 LCD_cs = 1;
BenRJG 1:acc66d3a1a1c 110 wait_us(CD); //DDRAM location Second line is 0x00C0 first line starts at 0x0080
BenRJG 1:acc66d3a1a1c 111 return 0;
BenRJG 1:acc66d3a1a1c 112 }
BenRJG 1:acc66d3a1a1c 113
BenRJG 1:acc66d3a1a1c 114 int lcd_display(char* str){
BenRJG 1:acc66d3a1a1c 115
BenRJG 1:acc66d3a1a1c 116 if (strlen(str)>16){return -1;} //return code !=0 is error
BenRJG 1:acc66d3a1a1c 117
BenRJG 1:acc66d3a1a1c 118 uint8_t command_data=1;
BenRJG 1:acc66d3a1a1c 119 uint32_t wait_time;
BenRJG 1:acc66d3a1a1c 120
BenRJG 1:acc66d3a1a1c 121 switch(command_data){
BenRJG 1:acc66d3a1a1c 122 case 0: wait_time=DD; break;
BenRJG 1:acc66d3a1a1c 123 case 1: wait_time=CD; break;
BenRJG 1:acc66d3a1a1c 124 default: return -1;
BenRJG 1:acc66d3a1a1c 125 }
BenRJG 1:acc66d3a1a1c 126
BenRJG 1:acc66d3a1a1c 127 for (int i=0; i<strlen(str);i++){
BenRJG 1:acc66d3a1a1c 128 LCD_cs = 0;
BenRJG 1:acc66d3a1a1c 129 spi_cmd.write(0);
BenRJG 1:acc66d3a1a1c 130 spi.write((command_data<<8)+str[i]);
BenRJG 1:acc66d3a1a1c 131 LCD_cs = 1;
BenRJG 1:acc66d3a1a1c 132 wait_us(wait_time);
BenRJG 1:acc66d3a1a1c 133 }
BenRJG 1:acc66d3a1a1c 134 return 0;
BenRJG 1:acc66d3a1a1c 135 }
BenRJG 1:acc66d3a1a1c 136
BenRJG 1:acc66d3a1a1c 137 int bar_graph(uint8_t level){
BenRJG 1:acc66d3a1a1c 138 if (level>16){return -1;} //return code !=0 is error
BenRJG 1:acc66d3a1a1c 139 LCD_cs = 0;spi_cmd.write(0);spi.write(0x00C0);LCD_cs = 1;wait_us(CD); //DDRAM location Second line is 0x00C0 first line starts at 0x0080
BenRJG 1:acc66d3a1a1c 140 for (int i=1; i<=level ;i++)
BenRJG 1:acc66d3a1a1c 141 {
BenRJG 1:acc66d3a1a1c 142 if(level>0){LCD_cs = 0;spi_cmd.write(0);spi.write(0x01FF);LCD_cs = 1;wait_us(DD);} // BLACK SPACE
BenRJG 1:acc66d3a1a1c 143 else{LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD);} // WHITE SPACE
BenRJG 1:acc66d3a1a1c 144 }
BenRJG 1:acc66d3a1a1c 145 for (int i=level; i<=16 ;i++)
BenRJG 1:acc66d3a1a1c 146 {
BenRJG 1:acc66d3a1a1c 147 LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD); // SPACE
BenRJG 1:acc66d3a1a1c 148 }
BenRJG 1:acc66d3a1a1c 149 return 0; // return code ==0 is OK
BenRJG 1:acc66d3a1a1c 150 }
BenRJG 1:acc66d3a1a1c 151
BenRJG 1:acc66d3a1a1c 152 int read_adc(void){
BenRJG 1:acc66d3a1a1c 153 int adval_d;
BenRJG 1:acc66d3a1a1c 154 float adval_f;
BenRJG 1:acc66d3a1a1c 155 ADC_cs = 0;
BenRJG 1:acc66d3a1a1c 156 adval_d = spi.write(0x00);
BenRJG 1:acc66d3a1a1c 157 ADC_cs =1 ;
BenRJG 1:acc66d3a1a1c 158 adval_f = 3.3f*((float)adval_d/4095);
BenRJG 1:acc66d3a1a1c 159 printf("%d %.3fV\r\n",adval_d,adval_f);
BenRJG 1:acc66d3a1a1c 160 return adval_d;
BenRJG 1:acc66d3a1a1c 161 }
BenRJG 1:acc66d3a1a1c 162
BenRJG 1:acc66d3a1a1c 163 void pulse_bar_graph(void){
BenRJG 1:acc66d3a1a1c 164 for (uint8_t i=0;i<16;i++)
BenRJG 1:acc66d3a1a1c 165 {
BenRJG 1:acc66d3a1a1c 166 printf("%u\r\n",i);
BenRJG 1:acc66d3a1a1c 167 bar_graph(i);
BenRJG 1:acc66d3a1a1c 168 wait_ms(100);
BenRJG 1:acc66d3a1a1c 169 }
BenRJG 1:acc66d3a1a1c 170 for (int8_t i=15;i>=0;i--)
BenRJG 1:acc66d3a1a1c 171 {
BenRJG 1:acc66d3a1a1c 172 printf("%u\r\n",i);
BenRJG 1:acc66d3a1a1c 173 bar_graph(i);
BenRJG 1:acc66d3a1a1c 174 wait_ms(100);
BenRJG 1:acc66d3a1a1c 175 }
BenRJG 1:acc66d3a1a1c 176 }
BenRJG 1:acc66d3a1a1c 177
BenRJG 1:acc66d3a1a1c 178 int read_switches(void){
BenRJG 1:acc66d3a1a1c 179 int sw_val;
BenRJG 3:d6e142b6ead1 180 LED_cs = 0;
BenRJG 1:acc66d3a1a1c 181 spi_cmd.write(0);
BenRJG 1:acc66d3a1a1c 182 sw_val = spi.write(0x00)&0x0F; // Just want lower 4bit nibble
BenRJG 3:d6e142b6ead1 183 LED_cs = 1 ;
BenRJG 1:acc66d3a1a1c 184 if (sw_val&(1<<0)){printf("Switch 0 :");}
BenRJG 1:acc66d3a1a1c 185 if (sw_val&(1<<1)){printf("Switch 1 :");}
BenRJG 1:acc66d3a1a1c 186 if (sw_val&(1<<2)){printf("Switch 2 :");}
BenRJG 1:acc66d3a1a1c 187 if (sw_val&(1<<3)){printf("Switch 3 :");}
BenRJG 1:acc66d3a1a1c 188 if (sw_val>0){printf("\r\n");}
BenRJG 1:acc66d3a1a1c 189 return sw_val;
BenRJG 1:acc66d3a1a1c 190 }