.

https://www.mediafire.com/file/sjhxgn70gxshilg/protocol_spi_pwm.png/file

Committer:
voltxd
Date:
Tue Apr 26 11:11:49 2022 +0000
Revision:
112:478ae92cb106
Parent:
111:f11575e7c79b
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 82:abf1b1785bd7 1 /* mbed Microcontroller Library
mbed_official 102:6979ad8bc0bc 2 * Copyright (c) 2019 ARM Limited
mbed_official 82:abf1b1785bd7 3 * SPDX-License-Identifier: Apache-2.0
mbed_official 82:abf1b1785bd7 4 */
mbed_official 82:abf1b1785bd7 5
Jonathan Austin 0:2757d7abb7d9 6 #include "mbed.h"
mbed_official 100:ec006d6f3cb6 7 #include "platform/mbed_thread.h"
voltxd 109:4ee7ffc8f175 8 #include "protocol.h"
Jonathan Austin 0:2757d7abb7d9 9
voltxd 108:2fd41d299a8c 10 //Define SPI
voltxd 108:2fd41d299a8c 11 #define SPI3_MOSI D11
voltxd 108:2fd41d299a8c 12 #define SPI3_MISO D12
voltxd 108:2fd41d299a8c 13 #define SPI3_SCLK D13
voltxd 108:2fd41d299a8c 14 #define SPI3_CS A3
ajuton 107:0965c72c798e 15
voltxd 108:2fd41d299a8c 16 //Define PWM
voltxd 112:478ae92cb106 17 #define PWM_PROP D9
voltxd 112:478ae92cb106 18 #define PWM_DIR D10
voltxd 112:478ae92cb106 19
voltxd 112:478ae92cb106 20 //fontion interrupt SP
voltxd 112:478ae92cb106 21 void onRxInterrupt();
ajuton 107:0965c72c798e 22
voltxd 111:f11575e7c79b 23 //Declaration PWM outputs
voltxd 108:2fd41d299a8c 24 PwmOut propulsion(PWM_PROP);
voltxd 108:2fd41d299a8c 25 PwmOut direction(PWM_DIR);
ajuton 107:0965c72c798e 26
voltxd 111:f11575e7c79b 27 //Declaration Links
voltxd 112:478ae92cb106 28 static UnbufferedSerial serial_port(USBTX, USBRX,115200);
voltxd 108:2fd41d299a8c 29 SPISlave device(SPI3_MOSI, SPI3_MISO, SPI3_SCLK, SPI3_CS); // mosi, miso, sclk, ssel
mbed_official 102:6979ad8bc0bc 30
mbed_official 82:abf1b1785bd7 31 int main()
mbed_official 82:abf1b1785bd7 32 {
voltxd 111:f11575e7c79b 33 //Declaration PWM variables
ajuton 107:0965c72c798e 34 uint32_t pulsewidth_direction = 1100;
voltxd 109:4ee7ffc8f175 35 uint32_t pulsewidth_propulsion = 1500;
voltxd 109:4ee7ffc8f175 36
voltxd 111:f11575e7c79b 37 //Test Serial port
voltxd 111:f11575e7c79b 38 serial_port.write("Test\n\r",strlen("Test\n\r"));
voltxd 109:4ee7ffc8f175 39
voltxd 112:478ae92cb106 40 //Interrupt SP
voltxd 112:478ae92cb106 41 serial_port.attach(&onRxInterrupt, SerialBase::RxIrq);
voltxd 112:478ae92cb106 42
voltxd 111:f11575e7c79b 43 //Init. propulsion PWM
ajuton 107:0965c72c798e 44 propulsion.period_us(20000);
voltxd 109:4ee7ffc8f175 45 propulsion.pulsewidth_us(pulsewidth_propulsion);
voltxd 109:4ee7ffc8f175 46
voltxd 108:2fd41d299a8c 47 thread_sleep_for(2000);
voltxd 109:4ee7ffc8f175 48
voltxd 111:f11575e7c79b 49 //Init. Direction PWM
ajuton 107:0965c72c798e 50 direction.period_us(20000);
ajuton 107:0965c72c798e 51 direction.pulsewidth_us(pulsewidth_direction);
voltxd 109:4ee7ffc8f175 52
voltxd 111:f11575e7c79b 53 //Init. SPI Link
voltxd 108:2fd41d299a8c 54 device.format(8);
voltxd 108:2fd41d299a8c 55
voltxd 111:f11575e7c79b 56 //Infinite loop
voltxd 111:f11575e7c79b 57 while(1)
voltxd 111:f11575e7c79b 58 {
voltxd 111:f11575e7c79b 59 //If SPI received a char, decode it then reply bullshit.
voltxd 110:a6d1d3525014 60 if(device.receive())
voltxd 109:4ee7ffc8f175 61 {
voltxd 112:478ae92cb106 62 char c = device.read();
voltxd 112:478ae92cb106 63 decodeMessage(c);
voltxd 112:478ae92cb106 64 serial_port.write(&c, 1);
voltxd 111:f11575e7c79b 65 device.reply(0b10101010);
voltxd 109:4ee7ffc8f175 66 }
voltxd 111:f11575e7c79b 67
voltxd 111:f11575e7c79b 68 //If decoding has ended, get and changes PWM values.
voltxd 110:a6d1d3525014 69 if(isDataAvailable())
voltxd 109:4ee7ffc8f175 70 {
voltxd 110:a6d1d3525014 71 getVerifiedPWMValues(&pulsewidth_propulsion, &pulsewidth_direction);
voltxd 109:4ee7ffc8f175 72 propulsion.pulsewidth_us(pulsewidth_propulsion);
voltxd 109:4ee7ffc8f175 73 direction.pulsewidth_us(pulsewidth_direction);
voltxd 111:f11575e7c79b 74 }
voltxd 112:478ae92cb106 75
Jonathan Austin 0:2757d7abb7d9 76 }
Jonathan Austin 0:2757d7abb7d9 77 }
voltxd 112:478ae92cb106 78
voltxd 112:478ae92cb106 79 void onRxInterrupt()
voltxd 112:478ae92cb106 80 {
voltxd 112:478ae92cb106 81 char c;
voltxd 112:478ae92cb106 82
voltxd 112:478ae92cb106 83
voltxd 112:478ae92cb106 84 // Read the data to clear the receive interrupt.
voltxd 112:478ae92cb106 85 if (serial_port.read(&c, 1)) {
voltxd 112:478ae92cb106 86 decodeMessage(c);
voltxd 112:478ae92cb106 87 serial_port.write(&c, 1);
voltxd 112:478ae92cb106 88 }
voltxd 112:478ae92cb106 89
voltxd 112:478ae92cb106 90 }