Ben Gordon
/
Muscle_Controlled_Servo
SPI.cpp@1:acc66d3a1a1c, 2018-04-01 (annotated)
- Committer:
- BenRJG
- Date:
- Sun Apr 01 15:43:02 2018 +0000
- Revision:
- 1:acc66d3a1a1c
- Child:
- 2:b615682e3e4f
Converted supplied SPI code to separate SPI files
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:acc66d3a1a1c | 7 | DigitalOut cs(PC_6); // Chip Select for Basic Outputs to illuminate Onboard FPGA DEO nano LEDs CN7 pin 1 |
BenRJG | 1:acc66d3a1a1c | 8 | DigitalOut LCD_cs(PB_15); // Chip Select for the LCD via FPGA CN7 pin 3 |
BenRJG | 1:acc66d3a1a1c | 9 | DigitalOut ADC_cs(PB_9); // Chip Select for the ADC via FPGA CN7 pin 4 |
BenRJG | 1:acc66d3a1a1c | 10 | |
BenRJG | 1:acc66d3a1a1c | 11 | //NBB the following line for F429ZI !!!! |
BenRJG | 1:acc66d3a1a1c | 12 | DigitalIn DO_NOT_USE(PB_12); // MAKE PB_12 (D19) an INPUT do NOT make an OUTPUT under any circumstances !!!!! ************* !!!!!!!!!!! |
BenRJG | 1:acc66d3a1a1c | 13 | // This Pin is connected to the 5VDC from the FPGA card and an INPUT is 5V Tolerant |
BenRJG | 1:acc66d3a1a1c | 14 | |
BenRJG | 1:acc66d3a1a1c | 15 | //Ticker ticktock; |
BenRJG | 1:acc66d3a1a1c | 16 | |
BenRJG | 1:acc66d3a1a1c | 17 | |
BenRJG | 1:acc66d3a1a1c | 18 | int lcd_cls(void){ |
BenRJG | 1:acc66d3a1a1c | 19 | LCD_cs = 0;spi_cmd.write(0);spi.write(0x0001);LCD_cs = 1;wait_us(CD); //Clear Screen |
BenRJG | 1:acc66d3a1a1c | 20 | return 0; |
BenRJG | 1:acc66d3a1a1c | 21 | } |
BenRJG | 1:acc66d3a1a1c | 22 | |
BenRJG | 1:acc66d3a1a1c | 23 | int lcd_locate(uint8_t line, uint8_t column){ |
BenRJG | 1:acc66d3a1a1c | 24 | uint8_t line_addr; |
BenRJG | 1:acc66d3a1a1c | 25 | uint8_t column_addr; |
BenRJG | 1:acc66d3a1a1c | 26 | switch(line){ |
BenRJG | 1:acc66d3a1a1c | 27 | case 1: line_addr=0x80; break; |
BenRJG | 1:acc66d3a1a1c | 28 | case 2: line_addr=0xC0; break; |
BenRJG | 1:acc66d3a1a1c | 29 | default: return -1; //return code !=0 is error |
BenRJG | 1:acc66d3a1a1c | 30 | } |
BenRJG | 1:acc66d3a1a1c | 31 | if(column<16){column_addr=column;} |
BenRJG | 1:acc66d3a1a1c | 32 | else{return -1;} |
BenRJG | 1:acc66d3a1a1c | 33 | LCD_cs = 0; |
BenRJG | 1:acc66d3a1a1c | 34 | spi_cmd.write(0); |
BenRJG | 1:acc66d3a1a1c | 35 | spi.write(line_addr+column_addr); |
BenRJG | 1:acc66d3a1a1c | 36 | LCD_cs = 1; |
BenRJG | 1:acc66d3a1a1c | 37 | wait_us(CD); //DDRAM location Second line is 0x00C0 first line starts at 0x0080 |
BenRJG | 1:acc66d3a1a1c | 38 | return 0; |
BenRJG | 1:acc66d3a1a1c | 39 | } |
BenRJG | 1:acc66d3a1a1c | 40 | |
BenRJG | 1:acc66d3a1a1c | 41 | int lcd_display(char* str){ |
BenRJG | 1:acc66d3a1a1c | 42 | |
BenRJG | 1:acc66d3a1a1c | 43 | if (strlen(str)>16){return -1;} //return code !=0 is error |
BenRJG | 1:acc66d3a1a1c | 44 | |
BenRJG | 1:acc66d3a1a1c | 45 | uint8_t command_data=1; |
BenRJG | 1:acc66d3a1a1c | 46 | uint32_t wait_time; |
BenRJG | 1:acc66d3a1a1c | 47 | |
BenRJG | 1:acc66d3a1a1c | 48 | switch(command_data){ |
BenRJG | 1:acc66d3a1a1c | 49 | case 0: wait_time=DD; break; |
BenRJG | 1:acc66d3a1a1c | 50 | case 1: wait_time=CD; break; |
BenRJG | 1:acc66d3a1a1c | 51 | default: return -1; |
BenRJG | 1:acc66d3a1a1c | 52 | } |
BenRJG | 1:acc66d3a1a1c | 53 | |
BenRJG | 1:acc66d3a1a1c | 54 | for (int i=0; i<strlen(str);i++){ |
BenRJG | 1:acc66d3a1a1c | 55 | LCD_cs = 0; |
BenRJG | 1:acc66d3a1a1c | 56 | spi_cmd.write(0); |
BenRJG | 1:acc66d3a1a1c | 57 | spi.write((command_data<<8)+str[i]); |
BenRJG | 1:acc66d3a1a1c | 58 | LCD_cs = 1; |
BenRJG | 1:acc66d3a1a1c | 59 | wait_us(wait_time); |
BenRJG | 1:acc66d3a1a1c | 60 | } |
BenRJG | 1:acc66d3a1a1c | 61 | return 0; |
BenRJG | 1:acc66d3a1a1c | 62 | } |
BenRJG | 1:acc66d3a1a1c | 63 | |
BenRJG | 1:acc66d3a1a1c | 64 | int bar_graph(uint8_t level){ |
BenRJG | 1:acc66d3a1a1c | 65 | if (level>16){return -1;} //return code !=0 is error |
BenRJG | 1:acc66d3a1a1c | 66 | 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 | 67 | for (int i=1; i<=level ;i++) |
BenRJG | 1:acc66d3a1a1c | 68 | { |
BenRJG | 1:acc66d3a1a1c | 69 | if(level>0){LCD_cs = 0;spi_cmd.write(0);spi.write(0x01FF);LCD_cs = 1;wait_us(DD);} // BLACK SPACE |
BenRJG | 1:acc66d3a1a1c | 70 | else{LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD);} // WHITE SPACE |
BenRJG | 1:acc66d3a1a1c | 71 | } |
BenRJG | 1:acc66d3a1a1c | 72 | for (int i=level; i<=16 ;i++) |
BenRJG | 1:acc66d3a1a1c | 73 | { |
BenRJG | 1:acc66d3a1a1c | 74 | LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD); // SPACE |
BenRJG | 1:acc66d3a1a1c | 75 | } |
BenRJG | 1:acc66d3a1a1c | 76 | return 0; // return code ==0 is OK |
BenRJG | 1:acc66d3a1a1c | 77 | } |
BenRJG | 1:acc66d3a1a1c | 78 | |
BenRJG | 1:acc66d3a1a1c | 79 | int read_adc(void){ |
BenRJG | 1:acc66d3a1a1c | 80 | int adval_d; |
BenRJG | 1:acc66d3a1a1c | 81 | float adval_f; |
BenRJG | 1:acc66d3a1a1c | 82 | ADC_cs = 0; |
BenRJG | 1:acc66d3a1a1c | 83 | adval_d = spi.write(0x00); |
BenRJG | 1:acc66d3a1a1c | 84 | ADC_cs =1 ; |
BenRJG | 1:acc66d3a1a1c | 85 | adval_f = 3.3f*((float)adval_d/4095); |
BenRJG | 1:acc66d3a1a1c | 86 | printf("%d %.3fV\r\n",adval_d,adval_f); |
BenRJG | 1:acc66d3a1a1c | 87 | return adval_d; |
BenRJG | 1:acc66d3a1a1c | 88 | } |
BenRJG | 1:acc66d3a1a1c | 89 | |
BenRJG | 1:acc66d3a1a1c | 90 | void pulse_bar_graph(void){ |
BenRJG | 1:acc66d3a1a1c | 91 | for (uint8_t i=0;i<16;i++) |
BenRJG | 1:acc66d3a1a1c | 92 | { |
BenRJG | 1:acc66d3a1a1c | 93 | printf("%u\r\n",i); |
BenRJG | 1:acc66d3a1a1c | 94 | bar_graph(i); |
BenRJG | 1:acc66d3a1a1c | 95 | wait_ms(100); |
BenRJG | 1:acc66d3a1a1c | 96 | } |
BenRJG | 1:acc66d3a1a1c | 97 | for (int8_t i=15;i>=0;i--) |
BenRJG | 1:acc66d3a1a1c | 98 | { |
BenRJG | 1:acc66d3a1a1c | 99 | printf("%u\r\n",i); |
BenRJG | 1:acc66d3a1a1c | 100 | bar_graph(i); |
BenRJG | 1:acc66d3a1a1c | 101 | wait_ms(100); |
BenRJG | 1:acc66d3a1a1c | 102 | } |
BenRJG | 1:acc66d3a1a1c | 103 | } |
BenRJG | 1:acc66d3a1a1c | 104 | |
BenRJG | 1:acc66d3a1a1c | 105 | int read_switches(void){ |
BenRJG | 1:acc66d3a1a1c | 106 | int sw_val; |
BenRJG | 1:acc66d3a1a1c | 107 | cs = 0; |
BenRJG | 1:acc66d3a1a1c | 108 | spi_cmd.write(0); |
BenRJG | 1:acc66d3a1a1c | 109 | sw_val = spi.write(0x00)&0x0F; // Just want lower 4bit nibble |
BenRJG | 1:acc66d3a1a1c | 110 | cs = 1 ; |
BenRJG | 1:acc66d3a1a1c | 111 | if (sw_val&(1<<0)){printf("Switch 0 :");} |
BenRJG | 1:acc66d3a1a1c | 112 | if (sw_val&(1<<1)){printf("Switch 1 :");} |
BenRJG | 1:acc66d3a1a1c | 113 | if (sw_val&(1<<2)){printf("Switch 2 :");} |
BenRJG | 1:acc66d3a1a1c | 114 | if (sw_val&(1<<3)){printf("Switch 3 :");} |
BenRJG | 1:acc66d3a1a1c | 115 | if (sw_val>0){printf("\r\n");} |
BenRJG | 1:acc66d3a1a1c | 116 | return sw_val; |
BenRJG | 1:acc66d3a1a1c | 117 | } |