Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

108 строки
2.2KB

  1. #include "periph/gpio.h"
  2. #include "periph/uart.h"
  3. #include "checksum/crc8.h"
  4. #include "include/stepper.h"
  5. #include "include/stepper_params.h"
  6. #include "include/sensor.h"
  7. #define ENABLE_DEBUG (0)
  8. #include "debug.h"
  9. #define STEP_PIN (dev->p.step_pin)
  10. #define DIR_PIN (dev->p.dir_pin)
  11. #define UART (dev->p.uart)
  12. int stepper_init(stepper_t *dev, const stepper_params_t *params)
  13. {
  14. assert(dev && params);
  15. dev->p = *params;
  16. gpio_init(STEP_PIN, GPIO_OUT);
  17. uart_init(UART, 38400, NULL, NULL);
  18. le_uint32_t data;
  19. data.u32 = STEPPER_GCONF_VALUES;
  20. stepper_write(dev, STEPPER_GCONF_ADDR, &data);
  21. data.u32 = STEPPER_CHOPCONF_VALUES;
  22. stepper_write(dev, STEPPER_CHOPCONF_ADDR, &data);
  23. return STEPPER_OK;
  24. }
  25. int stepper_step(stepper_t *dev, stepper_direction_t *direction)
  26. {
  27. assert(direction);
  28. gpio_toggle(STEP_PIN);
  29. return STEPPER_OK;
  30. }
  31. uint8_t stepper_crc8(const uint8_t *data, size_t len, uint8_t g_polynom, uint8_t crc){
  32. for (size_t i=0; i < len; i++)
  33. {
  34. uint8_t current_byte = data[i];
  35. for (size_t i=0; i < 8; i++)
  36. {
  37. bool xor = (crc >> 7) ^ (current_byte & 0x01);
  38. crc = crc <<1;
  39. crc = xor ? crc ^ g_polynom : crc;
  40. current_byte = current_byte >> 1;
  41. }
  42. }
  43. return crc;
  44. }
  45. int stepper_write(stepper_t *dev, uint8_t reg, le_uint32_t *data)
  46. {
  47. uint8_t* message;
  48. uint32_t be_data;
  49. be_data = byteorder_swapl(data->u32);
  50. message = (uint8_t*) malloc(8 * sizeof(uint8_t));
  51. message[0] = STEPPER_UART_SYNC;
  52. message[1] = STEPPER_UART_SLAVE_ADDR;
  53. message[2] = reg | 0x80;
  54. memcpy(&message[3], data->u8, 4);
  55. message[7] = 0x0;
  56. printf(data);
  57. uint8_t crc = stepper_crc8(message, 7, 0x07, 0x0);
  58. message[7] = crc;
  59. uart_write(UART, message, 8);
  60. printf("\n");
  61. for (int i = 0; i<8; i++)
  62. {
  63. printf("%0.2x",message[i]);
  64. }
  65. printf("\n");
  66. return STEPPER_OK;
  67. }
  68. int stepper_read(stepper_t *dev, uint8_t reg)
  69. {
  70. uint8_t* message;
  71. message = (uint8_t*) malloc(4 * sizeof(uint8_t));
  72. message[0] = STEPPER_UART_SYNC;
  73. message[1] = STEPPER_UART_SLAVE_ADDR;
  74. message[2] = reg;
  75. message[3] = stepper_crc8(message, 3, 0x07, 0x0);
  76. uart_write(UART, message, 4);
  77. }