HAL_impl.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "HAL_impl.h"
  2. // Funkcia na nastavenie CS pinu
  3. static inline void CS_Select(void) {
  4. HAL_GPIO_WritePin(CHIP_SELECT_PORT, CHIP_SELECT_PIN, GPIO_PIN_RESET);
  5. }
  6. static inline void CS_Deselect(void) {
  7. HAL_GPIO_WritePin(CHIP_SELECT_PORT, CHIP_SELECT_PIN, GPIO_PIN_SET);
  8. }
  9. /*---------------------------------------------------------------------*/
  10. /* SPI */
  11. /*---------------------------------------------------------------------*/
  12. void initiliaze_SPI(void)
  13. {
  14. CS_Deselect();
  15. uint8_t dummy = 0x00;
  16. HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
  17. }
  18. int spi_master_read_register(uint8_t reg, uint8_t* rbuffer, uint32_t rlen)
  19. {
  20. #ifdef HAL_SPI_MODULE_ENABLED
  21. uint8_t dummy = 0x00;
  22. uint8_t status = HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
  23. if (status != HAL_OK) return status;
  24. CS_Select();
  25. // 3. Adresovanie registra
  26. uint8_t cmd = (reg & 0x7F) | 0x80;
  27. status = HAL_SPI_Transmit(&SPI_INSTANCE, &cmd, 1, HAL_MAX_DELAY);
  28. // 4. Čítanie dát
  29. for (uint32_t indi = 0; indi < rlen; indi++) {
  30. uint8_t rx = 0x00;
  31. status = HAL_SPI_TransmitReceive(&SPI_INSTANCE, &rx, &rbuffer[indi], 1, HAL_MAX_DELAY);
  32. if (status != HAL_OK) {
  33. CS_Deselect();
  34. return status;
  35. }
  36. }
  37. // 5. Chip select HIGH
  38. CS_Deselect();
  39. #endif // HAL_SPI_MODULE_ENABLED
  40. return 0;
  41. }
  42. int spi_master_write_register(uint8_t reg, const uint8_t* wbuffer, uint32_t wlen)
  43. {
  44. #ifdef HAL_SPI_MODULE_ENABLED
  45. HAL_StatusTypeDef status;
  46. uint8_t dummy = 0x00;
  47. uint8_t addr = (reg & 0x7F) | 0x00;
  48. // 1. Dummy transfer (pôvodne SPI.transfer(0x00) mimo transakcie)
  49. status = HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
  50. if (status != HAL_OK) return -1;
  51. // 2. Chip Select LOW
  52. CS_Select();
  53. // 3. Odoslanie adresy registra
  54. status = HAL_SPI_Transmit(&SPI_INSTANCE, &addr, 1, HAL_MAX_DELAY);
  55. if (status != HAL_OK) {
  56. CS_Deselect();
  57. return -2;
  58. }
  59. // 4. Odoslanie všetkých dát
  60. if (wlen > 0) {
  61. status = HAL_SPI_Transmit(&SPI_INSTANCE, (uint8_t*)wbuffer, wlen, HAL_MAX_DELAY);
  62. if (status != HAL_OK) {
  63. CS_Deselect();
  64. return -3;
  65. }
  66. }
  67. // 5. Chip Select HIGH
  68. CS_Deselect();
  69. #endif // HAL_SPI_MODULE_ENABLED
  70. return 0;
  71. }
  72. /*---------------------------------------------------------------------*/
  73. /* I2C */
  74. /*---------------------------------------------------------------------*/
  75. void initiliaze_I2C(void)
  76. {
  77. #ifdef HAL_I2C_MODULE_ENABLED
  78. I2C_Address = I2C_ADDRESS;
  79. #endif
  80. }
  81. int i2c_master_write_register(uint8_t address, uint8_t reg, uint32_t len, const uint8_t *data)
  82. {
  83. #ifdef HAL_I2C_MODULE_ENABLED
  84. HAL_StatusTypeDef status = HAL_I2C_Mem_Write(
  85. &I2C_INSTANCE,
  86. (address << 1), // STM32 expects 8-bit address
  87. reg, // Register address
  88. I2C_MEMADD_SIZE_8BIT, // Register size
  89. (uint8_t *)data,
  90. len,
  91. HAL_MAX_DELAY
  92. );
  93. if (status != HAL_OK)
  94. {
  95. return -1;
  96. }
  97. #endif // HAL_I2C_MODULE_ENABLED
  98. return 0;
  99. }
  100. int i2c_master_read_register(uint8_t address, uint8_t reg, uint32_t len, uint8_t *buff)
  101. {
  102. #ifdef HAL_I2C_MODULE_ENABLED
  103. HAL_StatusTypeDef status = HAL_I2C_Mem_Read(
  104. &I2C_INSTANCE,
  105. (address << 1), // STM32 expects 8-bit address
  106. reg, // Register address
  107. I2C_MEMADD_SIZE_8BIT, // Register size
  108. buff,
  109. len,
  110. HAL_MAX_DELAY
  111. );
  112. if (status != HAL_OK)
  113. {
  114. return -1;
  115. }
  116. #endif // HAL_I2C_MODULE_ENABLED
  117. return 0;
  118. }