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
- Committer:
- BenRJG
- Date:
- 2018-04-01
- Revision:
- 2:b615682e3e4f
- Parent:
- 1:acc66d3a1a1c
- Child:
- 3:d6e142b6ead1
File content as of revision 2:b615682e3e4f:
#include "SPI.h"
SPI spi(PA_7, PA_6, PA_5); // Ordered as: mosi, miso, sclk could use forth parameter ssel
// However using multi SPI devices within FPGA with a seperate chip select
SPI spi_cmd(PA_7, PA_6, PA_5); // NB another instance call spi_cmd for 8 bit SPI dataframe see later line 37
// For each device NB PA_7 PA_6 PA_5 are D11 D12 D13 respectively
DigitalOut cs(PC_6); // Chip Select for Basic Outputs to illuminate Onboard FPGA DEO nano LEDs CN7 pin 1
DigitalOut LCD_cs(PB_15); // Chip Select for the LCD via FPGA CN7 pin 3
DigitalOut ADC_cs(PB_9); // Chip Select for the ADC via FPGA CN7 pin 4
//NBB the following line for F429ZI !!!!
DigitalIn DO_NOT_USE(PB_12); // MAKE PB_12 (D19) an INPUT do NOT make an OUTPUT under any circumstances !!!!! ************* !!!!!!!!!!!
// This Pin is connected to the 5VDC from the FPGA card and an INPUT is 5V Tolerant
int adval_d; //A to D value read back
float adval_f;
int err; //error variable used for debugging, trapping etc.,
char adval[32];
//Ticker ticktock;
void SPI_INIT (void)
{
cs = 1; // Chip must be deselected, Chip Select is active LOW
LCD_cs = 1; // Chip must be deselected, Chip Select is active LOW
ADC_cs = 1; // Chip must be deselected, Chip Select is active LOW
spi.format(16,0); // Setup the DATA frame SPI for 16 bit wide word, Clock Polarity 0 and Clock Phase 0 (0)
spi_cmd.format(8,0); // Setup the COMMAND SPI as 8 Bit wide word, Clock Polarity 0 and Clock Phase 0 (0)
spi.frequency(1000000); // 1MHz clock rate
spi_cmd.frequency(1000000); // 1MHz clock rate
adval_d = 0; //A to D value read back
adval_f =0.0f;
err = 0; //error variable used for debugging, trapping etc.,
// Preload some arrays
// char hello_world[]="Hello World";
char splash_screen1[]="Martin Simpson";
char splash_screen2[]="Plymouth UNI";
char DVM[]="Voltage=";
// Start up sequences
lcd_cls();
lcd_locate(1,1);
lcd_display(splash_screen1); //Credit line 1
lcd_locate(2,2);
lcd_display(splash_screen2); //Credit line 2
wait(2);
lcd_cls();
pulse_bar_graph(); //Flashy bargraph clear screen
lcd_locate(1,0);
lcd_display(DVM); //Type Voltage display
lcd_locate(1,13);
lcd_display("V"); //Units display
}
void SPI_TEST(void)
{
adval_d = read_adc();
adval_f = 3.3f*((float)adval_d/4095);//Convert 12 bit to a float and scale
sprintf(adval,"%.3f",adval_f); //Store in an array string
lcd_locate(1,8); //and display on LCD
lcd_display(adval); //
err = bar_graph(adval_d/255); // 16*256 =4096 12 bit ADC!
if (err < 0){printf("Display Overload\r\n");}
read_switches();
//LED Chaser display KIT lives on!
for (uint32_t i=1;i<=128;i*=2)
{
cs = 0; //Select the device by seting chip select LOW
spi_cmd.write(0);
spi.write(i);
cs = 1; //De-Select the device by seting chip select HIGH
wait_ms(20);
}
for (uint32_t i=128;i>=1;i/=2)
{
cs = 0; //Select the device by seting chip select LOW
spi_cmd.write(0);
spi.write(i);
cs = 1; //De-Select the device by seting chip select HIGH
wait_ms(20);
}
}
int lcd_cls(void){
LCD_cs = 0;spi_cmd.write(0);spi.write(0x0001);LCD_cs = 1;wait_us(CD); //Clear Screen
return 0;
}
int lcd_locate(uint8_t line, uint8_t column){
uint8_t line_addr;
uint8_t column_addr;
switch(line){
case 1: line_addr=0x80; break;
case 2: line_addr=0xC0; break;
default: return -1; //return code !=0 is error
}
if(column<16){column_addr=column;}
else{return -1;}
LCD_cs = 0;
spi_cmd.write(0);
spi.write(line_addr+column_addr);
LCD_cs = 1;
wait_us(CD); //DDRAM location Second line is 0x00C0 first line starts at 0x0080
return 0;
}
int lcd_display(char* str){
if (strlen(str)>16){return -1;} //return code !=0 is error
uint8_t command_data=1;
uint32_t wait_time;
switch(command_data){
case 0: wait_time=DD; break;
case 1: wait_time=CD; break;
default: return -1;
}
for (int i=0; i<strlen(str);i++){
LCD_cs = 0;
spi_cmd.write(0);
spi.write((command_data<<8)+str[i]);
LCD_cs = 1;
wait_us(wait_time);
}
return 0;
}
int bar_graph(uint8_t level){
if (level>16){return -1;} //return code !=0 is error
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
for (int i=1; i<=level ;i++)
{
if(level>0){LCD_cs = 0;spi_cmd.write(0);spi.write(0x01FF);LCD_cs = 1;wait_us(DD);} // BLACK SPACE
else{LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD);} // WHITE SPACE
}
for (int i=level; i<=16 ;i++)
{
LCD_cs = 0;spi_cmd.write(0);spi.write(0x0120);LCD_cs = 1;wait_us(DD); // SPACE
}
return 0; // return code ==0 is OK
}
int read_adc(void){
int adval_d;
float adval_f;
ADC_cs = 0;
adval_d = spi.write(0x00);
ADC_cs =1 ;
adval_f = 3.3f*((float)adval_d/4095);
printf("%d %.3fV\r\n",adval_d,adval_f);
return adval_d;
}
void pulse_bar_graph(void){
for (uint8_t i=0;i<16;i++)
{
printf("%u\r\n",i);
bar_graph(i);
wait_ms(100);
}
for (int8_t i=15;i>=0;i--)
{
printf("%u\r\n",i);
bar_graph(i);
wait_ms(100);
}
}
int read_switches(void){
int sw_val;
cs = 0;
spi_cmd.write(0);
sw_val = spi.write(0x00)&0x0F; // Just want lower 4bit nibble
cs = 1 ;
if (sw_val&(1<<0)){printf("Switch 0 :");}
if (sw_val&(1<<1)){printf("Switch 1 :");}
if (sw_val&(1<<2)){printf("Switch 2 :");}
if (sw_val&(1<<3)){printf("Switch 3 :");}
if (sw_val>0){printf("\r\n");}
return sw_val;
}
