test code for SPI communications with any board

Dependencies:   mbed-dev

Committer:
adimmit
Date:
Mon Jan 31 20:43:05 2022 +0000
Revision:
15:d3c93f01a02b
Parent:
14:8a7fd1ebc209
Child:
16:8f8adc5f8f0a
works in interrupt;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adimmit 0:76c761d3caf1 1
adimmit 15:d3c93f01a02b 2
adimmit 0:76c761d3caf1 3 //GO THROUGH AND RE-CHECK ALL THE VARIABLES, STRUCT NAMES, SIZES, BUFFERS + ETC!!!
adimmit 0:76c761d3caf1 4 //ALSO GO THROUGH THE COMMENTS TO SEE IF THEY NEED CHANGING
adimmit 0:76c761d3caf1 5
adimmit 0:76c761d3caf1 6 #include "mbed.h"
adimmit 0:76c761d3caf1 7 #include "math_ops.h"
adimmit 0:76c761d3caf1 8 #include <cstring>
adimmit 0:76c761d3caf1 9 #include "leg_message.h"
adimmit 0:76c761d3caf1 10
adimmit 15:d3c93f01a02b 11 #define BYTES 196
adimmit 15:d3c93f01a02b 12 #define RX_LEN 196
adimmit 15:d3c93f01a02b 13 #define TX_LEN 124
adimmit 0:76c761d3caf1 14
adimmit 15:d3c93f01a02b 15 // spi buffers
adimmit 15:d3c93f01a02b 16 uint8_t rx_buff[RX_LEN];
adimmit 15:d3c93f01a02b 17 uint8_t tx_buff[TX_LEN];
adimmit 14:8a7fd1ebc209 18
adimmit 15:d3c93f01a02b 19 // vars
adimmit 0:76c761d3caf1 20 spi_data_t spi_data; // data from spine to up
adimmit 0:76c761d3caf1 21 spi_command_t spi_command; // data from up to spine
adimmit 15:d3c93f01a02b 22 spi_command_t tmp_crc_chk; // data from up to spine
adimmit 0:76c761d3caf1 23
adimmit 0:76c761d3caf1 24 Serial pc(PA_2, PA_3);
adimmit 0:76c761d3caf1 25
adimmit 0:76c761d3caf1 26 int spi_enabled = 0;
adimmit 0:76c761d3caf1 27 InterruptIn cs(PA_4);
adimmit 15:d3c93f01a02b 28 SPISlave spi(PA_7, PA_6, PA_5, PA_4);
adimmit 0:76c761d3caf1 29
adimmit 0:76c761d3caf1 30 uint32_t xor_checksum(uint32_t* data, size_t len)
adimmit 0:76c761d3caf1 31 {
adimmit 0:76c761d3caf1 32 uint32_t t = 0;
adimmit 0:76c761d3caf1 33 for(int i = 0; i < len; i++)
adimmit 0:76c761d3caf1 34 t = t ^ data[i];
adimmit 0:76c761d3caf1 35 return t;
adimmit 0:76c761d3caf1 36 }
adimmit 0:76c761d3caf1 37
adimmit 15:d3c93f01a02b 38 void process()
adimmit 15:d3c93f01a02b 39 {
adimmit 15:d3c93f01a02b 40 // update qs
adimmit 15:d3c93f01a02b 41 spi_data.q_1s[0] = spi_command.q_des_1s[0]+1.0;
adimmit 15:d3c93f01a02b 42 spi_data.q_2s[0] = spi_command.q_des_2s[0]+1.0;
adimmit 15:d3c93f01a02b 43 spi_data.q_3s[0] = spi_command.q_des_3s[0]+1.0;
adimmit 15:d3c93f01a02b 44 spi_data.q_1s[1] = spi_command.q_des_1s[1]+1.0;
adimmit 15:d3c93f01a02b 45 spi_data.q_2s[1] = spi_command.q_des_2s[1]+1.0;
adimmit 15:d3c93f01a02b 46 spi_data.q_3s[1] = spi_command.q_des_3s[1]+1.0;
adimmit 15:d3c93f01a02b 47 spi_data.q_1s[2] = spi_command.q_des_1s[2]+1.0;
adimmit 15:d3c93f01a02b 48 spi_data.q_2s[2] = spi_command.q_des_2s[2]+1.0;
adimmit 15:d3c93f01a02b 49 spi_data.q_3s[2] = spi_command.q_des_3s[2]+1.0;
adimmit 15:d3c93f01a02b 50 // update qds
adimmit 15:d3c93f01a02b 51 spi_data.qd_1s[0] = spi_command.qd_des_1s[0]+1.0;
adimmit 15:d3c93f01a02b 52 spi_data.qd_2s[0] = spi_command.qd_des_2s[0]+1.0;
adimmit 15:d3c93f01a02b 53 spi_data.qd_3s[0] = spi_command.qd_des_3s[0]+1.0;
adimmit 15:d3c93f01a02b 54 spi_data.qd_1s[1] = spi_command.qd_des_1s[1]+1.0;
adimmit 15:d3c93f01a02b 55 spi_data.qd_2s[1] = spi_command.qd_des_2s[1]+1.0;
adimmit 15:d3c93f01a02b 56 spi_data.qd_3s[1] = spi_command.qd_des_3s[1]+1.0;
adimmit 15:d3c93f01a02b 57 spi_data.qd_1s[2] = spi_command.qd_des_1s[2]+1.0;
adimmit 15:d3c93f01a02b 58 spi_data.qd_2s[2] = spi_command.qd_des_2s[2]+1.0;
adimmit 15:d3c93f01a02b 59 spi_data.qd_3s[2] = spi_command.qd_des_3s[2]+1.0;
adimmit 15:d3c93f01a02b 60 // update taus
adimmit 15:d3c93f01a02b 61 spi_data.tau_1s[0] = spi_command.tau_1s_ff[0]+1.0;
adimmit 15:d3c93f01a02b 62 spi_data.tau_2s[0] = spi_command.tau_2s_ff[0]+1.0;
adimmit 15:d3c93f01a02b 63 spi_data.tau_3s[0] = spi_command.tau_3s_ff[0]+1.0;
adimmit 15:d3c93f01a02b 64 spi_data.tau_1s[1] = spi_command.tau_1s_ff[1]+1.0;
adimmit 15:d3c93f01a02b 65 spi_data.tau_2s[1] = spi_command.tau_2s_ff[1]+1.0;
adimmit 15:d3c93f01a02b 66 spi_data.tau_3s[1] = spi_command.tau_3s_ff[1]+1.0;
adimmit 15:d3c93f01a02b 67 spi_data.tau_1s[2] = spi_command.tau_1s_ff[2]+1.0;
adimmit 15:d3c93f01a02b 68 spi_data.tau_2s[2] = spi_command.tau_2s_ff[2]+1.0;
adimmit 15:d3c93f01a02b 69 spi_data.tau_3s[2] = spi_command.tau_3s_ff[2]+1.0;
adimmit 15:d3c93f01a02b 70 // UDPATE FLAGS
adimmit 15:d3c93f01a02b 71 spi_data.flags[0] = 0;
adimmit 15:d3c93f01a02b 72 spi_data.flags[1] = 0;
adimmit 15:d3c93f01a02b 73 spi_data.flags[2] = 0;
adimmit 15:d3c93f01a02b 74 // UPDATE CHECKSUM
adimmit 15:d3c93f01a02b 75 spi_data.checksum = xor_checksum((uint32_t*)&spi_data, 30); //NOTE, CHECK THIS WE WANT TO DO IT ON THE FIRST 16 SPI BYTES
adimmit 2:32f69175c78e 76 }
adimmit 2:32f69175c78e 77
adimmit 0:76c761d3caf1 78 void spi_isr(void)
adimmit 0:76c761d3caf1 79 {
adimmit 0:76c761d3caf1 80 int bytecount = 0;
adimmit 15:d3c93f01a02b 81 //spi.reply(tx_buff[0]);
adimmit 15:d3c93f01a02b 82 while (cs==0){
adimmit 15:d3c93f01a02b 83 if(spi.receive()) {
adimmit 15:d3c93f01a02b 84 rx_buff[bytecount] = spi.read();
adimmit 15:d3c93f01a02b 85 if (bytecount<TX_LEN) {spi.reply(tx_buff[bytecount]);}
adimmit 0:76c761d3caf1 86 bytecount++;
adimmit 0:76c761d3caf1 87 }
adimmit 0:76c761d3caf1 88 }
adimmit 15:d3c93f01a02b 89
adimmit 15:d3c93f01a02b 90 //update crc_chk from buffer
adimmit 15:d3c93f01a02b 91 for(int i = 0; i < RX_LEN; i++) {((uint8_t*)(&tmp_crc_chk))[i] = rx_buff[i];}
adimmit 15:d3c93f01a02b 92 // CHECK THE CHECKSUM
adimmit 15:d3c93f01a02b 93 uint32_t _crc = xor_checksum((uint32_t*)&tmp_crc_chk, 48);
adimmit 15:d3c93f01a02b 94 // READ CHECKSUM
adimmit 15:d3c93f01a02b 95 uint32_t _rx_crc = tmp_crc_chk.checksum;
adimmit 15:d3c93f01a02b 96
adimmit 15:d3c93f01a02b 97 if(_crc == _rx_crc) {
adimmit 15:d3c93f01a02b 98 //pc.printf("CHECKSUM PASSED...");
adimmit 15:d3c93f01a02b 99 //update crc_chk from buffer
adimmit 15:d3c93f01a02b 100 spi_command = tmp_crc_chk;
adimmit 15:d3c93f01a02b 101 //do math on the input
adimmit 15:d3c93f01a02b 102 process();
adimmit 15:d3c93f01a02b 103 //populate the output
adimmit 15:d3c93f01a02b 104 for(int i = 0; i < TX_LEN; i++) {tx_buff[i] = ((uint8_t*)(&spi_data))[i];}
adimmit 15:d3c93f01a02b 105 }
adimmit 15:d3c93f01a02b 106 else {pc.printf("CRC FAILED...");}
adimmit 15:d3c93f01a02b 107 }
adimmit 0:76c761d3caf1 108
adimmit 0:76c761d3caf1 109
adimmit 0:76c761d3caf1 110 int main() {
adimmit 0:76c761d3caf1 111 wait(1);
adimmit 1:aa253b5f5b65 112 pc.baud(115200); //MAYBE CHANGE THIS IF NEEDED
adimmit 0:76c761d3caf1 113 //cs.fall(&spi_isr);
adimmit 0:76c761d3caf1 114
adimmit 15:d3c93f01a02b 115 memset(&tx_buff, 0, RX_LEN * sizeof(uint8_t));
adimmit 15:d3c93f01a02b 116 memset(&rx_buff, 0, TX_LEN * sizeof(uint8_t));
adimmit 1:aa253b5f5b65 117
adimmit 1:aa253b5f5b65 118 //just debugging things
adimmit 1:aa253b5f5b65 119 pc.printf("SETUP VARS ALL DONE\n");
adimmit 0:76c761d3caf1 120
adimmit 0:76c761d3caf1 121 // SPI doesn't work if enabled while the CS pin is pulled low
adimmit 0:76c761d3caf1 122 // Wait for CS to not be low, then enable SPI
adimmit 0:76c761d3caf1 123 if(!spi_enabled){
adimmit 15:d3c93f01a02b 124 while((spi_enabled==0) && (cs.read()==0)){pc.printf("waiting for CS Pin\n"); wait_us(10);}
adimmit 15:d3c93f01a02b 125 spi.format(8, 0);
adimmit 15:d3c93f01a02b 126 spi.frequency(500000);
adimmit 15:d3c93f01a02b 127 spi.reply(0x0);
adimmit 0:76c761d3caf1 128 spi_enabled = 1;
adimmit 15:d3c93f01a02b 129 cs.fall(&spi_isr);
adimmit 1:aa253b5f5b65 130 pc.printf("SPI ENABLED AND READY\n");
adimmit 0:76c761d3caf1 131 }
adimmit 0:76c761d3caf1 132
adimmit 15:d3c93f01a02b 133 //initialize the tx_buff
adimmit 15:d3c93f01a02b 134 for(int i = 0; i < TX_LEN; i++) {
adimmit 15:d3c93f01a02b 135 tx_buff[i] = ((uint8_t*)(&spi_data))[i];
adimmit 15:d3c93f01a02b 136 }
adimmit 15:d3c93f01a02b 137 //initialize the tx_buff
adimmit 15:d3c93f01a02b 138 for(int i = 0; i < RX_LEN; i++) {
adimmit 15:d3c93f01a02b 139 tx_buff[i] = ((uint8_t*)(&spi_command))[i];
adimmit 15:d3c93f01a02b 140 }
adimmit 15:d3c93f01a02b 141
adimmit 0:76c761d3caf1 142 while(1) {
adimmit 15:d3c93f01a02b 143 //do a thing
adimmit 13:ad3ca70bf929 144 }
adimmit 2:32f69175c78e 145
adimmit 0:76c761d3caf1 146 }