test code for SPI communications with any board
main.cpp@15:d3c93f01a02b, 2022-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |