Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Muscle_Controlled_Servo by
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 | } |
