SpiManager.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "SpiManager.h"
  2. SpiManager::SpiManager(SPI_HandleTypeDef *hspi)
  3. {
  4. _numDevices = 0;
  5. _activeDevice = -1;
  6. _spi = hspi;
  7. _active_bank = ub_NONE;
  8. }
  9. uint8_t SpiManager::addSlave(McuPin_typeDef *pin)
  10. {
  11. _pinCS[_numDevices] = pin;
  12. _numDevices++;
  13. return _numDevices-1;
  14. }
  15. void SpiManager::cs_low(uint8_t index)
  16. {
  17. _pinCS[index]->port->BRR = (uint32_t)_pinCS[index]->pin;
  18. }
  19. void SpiManager::cs_high(uint8_t index)
  20. {
  21. _pinCS[index]->port->BSRR = _pinCS[index]->pin;
  22. }
  23. void SpiManager::select_user_bank(uint8_t sensorNum, userbank ub)
  24. {
  25. // toto je v poriadku iba pri pouziti jedneho senzora
  26. // treba osetrit situaciu, ked je viacero senzorov.
  27. // zmena banky sa musi robit pre kazdy senzor
  28. // if(ub == _active_bank){
  29. // return;
  30. // }
  31. _active_bank = ub;
  32. uint8_t write_reg[2];
  33. write_reg[0] = WRITE | REG_BANK_SEL;
  34. write_reg[1] = ub;
  35. cs_low(sensorNum);
  36. HAL_SPI_Transmit(_spi, write_reg, 2, 10);
  37. cs_high(sensorNum);
  38. }
  39. void SpiManager::takeBus(uint8_t index)
  40. {
  41. while(_activeDevice >= 0){
  42. ; // wait
  43. }
  44. _activeDevice = index;
  45. }
  46. void SpiManager::releaseBus()
  47. {
  48. _activeDevice = -1;
  49. }
  50. uint8_t* SpiManager::read_multiple_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t len)
  51. {
  52. uint8_t read_reg = READ | reg;
  53. this->select_user_bank(sensorNum, ub);
  54. cs_low(sensorNum);
  55. HAL_SPI_Transmit(this->_spi, &read_reg, 1, 1000);
  56. HAL_SPI_Receive(this->_spi, this->_reg_val, len, 1000);
  57. cs_high(sensorNum);
  58. return this->_reg_val;
  59. }
  60. uint8_t SpiManager::read_single_reg(uint8_t sensorNum, userbank ub, uint8_t reg)
  61. {
  62. uint8_t read_reg = READ | reg;
  63. uint8_t reg_val;
  64. select_user_bank(sensorNum, ub);
  65. cs_low(sensorNum);
  66. HAL_SPI_Transmit(_spi, &read_reg, 1, 1000);
  67. HAL_SPI_Receive(_spi, &reg_val, 1, 1000);
  68. cs_high(sensorNum);
  69. return reg_val;
  70. }
  71. void SpiManager::write_single_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t val)
  72. {
  73. uint8_t write_reg[2];
  74. write_reg[0] = WRITE | reg;
  75. write_reg[1] = val;
  76. select_user_bank(sensorNum, ub);
  77. cs_low(sensorNum);
  78. HAL_SPI_Transmit(_spi, write_reg, 2, 1000);
  79. cs_high(sensorNum);
  80. }
  81. void SpiManager::write_multiple_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t* val, uint8_t len)
  82. {
  83. uint8_t write_reg = WRITE | reg;
  84. select_user_bank(sensorNum, ub);
  85. cs_low(sensorNum);
  86. HAL_SPI_Transmit(_spi, &write_reg, 1, 1000);
  87. HAL_SPI_Transmit(_spi, val, len, 1000);
  88. cs_high(sensorNum);
  89. }
  90. uint8_t SpiManager::read_single_external_reg(uint8_t sensorNum, uint8_t reg)
  91. {
  92. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
  93. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
  94. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x81);
  95. HAL_Delay(1);
  96. return this->read_single_reg(sensorNum, ub_0, B0_EXT_SLV_SENS_DATA_00);
  97. }
  98. void SpiManager::write_single_external_reg(uint8_t sensorNum, uint8_t reg, uint8_t val)
  99. {
  100. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, WRITE | MAG_SLAVE_ADDR);
  101. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
  102. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_DO, val);
  103. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x81);
  104. }
  105. uint8_t* SpiManager::read_multiple_external_reg(uint8_t sensorNum, uint8_t reg, uint8_t len)
  106. {
  107. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
  108. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
  109. this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x80 | len);
  110. HAL_Delay(1);
  111. return this->read_multiple_reg(sensorNum, ub_0, B0_EXT_SLV_SENS_DATA_00, len);
  112. }