#include "periph/gpio.h" #include "periph/uart.h" #include "checksum/crc8.h" #include "include/stepper.h" #include "include/stepper_params.h" #include "include/sensor.h" #define ENABLE_DEBUG (0) #include "debug.h" #define STEP_PIN (dev->p.step_pin) #define DIR_PIN (dev->p.dir_pin) #define UART (dev->p.uart) int stepper_init(stepper_t *dev, const stepper_params_t *params) { assert(dev && params); dev->p = *params; gpio_init(STEP_PIN, GPIO_OUT); uart_init(UART, 38400, NULL, NULL); le_uint32_t data; data.u32 = STEPPER_GCONF_VALUES; stepper_write(dev, STEPPER_GCONF_ADDR, &data); data.u32 = STEPPER_CHOPCONF_VALUES; stepper_write(dev, STEPPER_CHOPCONF_ADDR, &data); return STEPPER_OK; } int stepper_step(stepper_t *dev, stepper_direction_t *direction) { assert(direction); gpio_toggle(STEP_PIN); return STEPPER_OK; } uint8_t stepper_crc8(const uint8_t *data, size_t len, uint8_t g_polynom, uint8_t crc){ for (size_t i=0; i < len; i++) { uint8_t current_byte = data[i]; for (size_t i=0; i < 8; i++) { bool xor = (crc >> 7) ^ (current_byte & 0x01); crc = crc <<1; crc = xor ? crc ^ g_polynom : crc; current_byte = current_byte >> 1; } } return crc; } int stepper_write(stepper_t *dev, uint8_t reg, le_uint32_t *data) { uint8_t* message; uint32_t be_data; be_data = byteorder_swapl(data->u32); message = (uint8_t*) malloc(8 * sizeof(uint8_t)); message[0] = STEPPER_UART_SYNC; message[1] = STEPPER_UART_SLAVE_ADDR; message[2] = reg | 0x80; memcpy(&message[3], data->u8, 4); message[7] = 0x0; printf(data); uint8_t crc = stepper_crc8(message, 7, 0x07, 0x0); message[7] = crc; uart_write(UART, message, 8); printf("\n"); for (int i = 0; i<8; i++) { printf("%0.2x",message[i]); } printf("\n"); return STEPPER_OK; } int stepper_read(stepper_t *dev, uint8_t reg) { uint8_t* message; message = (uint8_t*) malloc(4 * sizeof(uint8_t)); message[0] = STEPPER_UART_SYNC; message[1] = STEPPER_UART_SLAVE_ADDR; message[2] = reg; message[3] = stepper_crc8(message, 3, 0x07, 0x0); uart_write(UART, message, 4); }