| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #include "SpiManager.h"
- SpiManager::SpiManager(SPI_HandleTypeDef *hspi)
- {
- _numDevices = 0;
- _activeDevice = -1;
- _spi = hspi;
- _active_bank = ub_NONE;
- }
- uint8_t SpiManager::addSlave(McuPin_typeDef *pin)
- {
- _pinCS[_numDevices] = pin;
- _numDevices++;
- return _numDevices-1;
- }
- void SpiManager::cs_low(uint8_t index)
- {
- _pinCS[index]->port->BRR = (uint32_t)_pinCS[index]->pin;
- }
- void SpiManager::cs_high(uint8_t index)
- {
- _pinCS[index]->port->BSRR = _pinCS[index]->pin;
- }
- void SpiManager::select_user_bank(uint8_t sensorNum, userbank ub)
- {
- // toto je v poriadku iba pri pouziti jedneho senzora
- // treba osetrit situaciu, ked je viacero senzorov.
- // zmena banky sa musi robit pre kazdy senzor
- // if(ub == _active_bank){
- // return;
- // }
- _active_bank = ub;
- uint8_t write_reg[2];
- write_reg[0] = WRITE | REG_BANK_SEL;
- write_reg[1] = ub;
- cs_low(sensorNum);
- HAL_SPI_Transmit(_spi, write_reg, 2, 10);
- cs_high(sensorNum);
- }
- void SpiManager::takeBus(uint8_t index)
- {
- while(_activeDevice >= 0){
- ; // wait
- }
- _activeDevice = index;
- }
- void SpiManager::releaseBus()
- {
- _activeDevice = -1;
- }
- uint8_t* SpiManager::read_multiple_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t len)
- {
- uint8_t read_reg = READ | reg;
- this->select_user_bank(sensorNum, ub);
- cs_low(sensorNum);
- HAL_SPI_Transmit(this->_spi, &read_reg, 1, 1000);
- HAL_SPI_Receive(this->_spi, this->_reg_val, len, 1000);
- cs_high(sensorNum);
- return this->_reg_val;
- }
- uint8_t SpiManager::read_single_reg(uint8_t sensorNum, userbank ub, uint8_t reg)
- {
- uint8_t read_reg = READ | reg;
- uint8_t reg_val;
- select_user_bank(sensorNum, ub);
- cs_low(sensorNum);
- HAL_SPI_Transmit(_spi, &read_reg, 1, 1000);
- HAL_SPI_Receive(_spi, ®_val, 1, 1000);
- cs_high(sensorNum);
- return reg_val;
- }
- void SpiManager::write_single_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t val)
- {
- uint8_t write_reg[2];
- write_reg[0] = WRITE | reg;
- write_reg[1] = val;
- select_user_bank(sensorNum, ub);
- cs_low(sensorNum);
- HAL_SPI_Transmit(_spi, write_reg, 2, 1000);
- cs_high(sensorNum);
- }
- void SpiManager::write_multiple_reg(uint8_t sensorNum, userbank ub, uint8_t reg, uint8_t* val, uint8_t len)
- {
- uint8_t write_reg = WRITE | reg;
- select_user_bank(sensorNum, ub);
- cs_low(sensorNum);
- HAL_SPI_Transmit(_spi, &write_reg, 1, 1000);
- HAL_SPI_Transmit(_spi, val, len, 1000);
- cs_high(sensorNum);
- }
- uint8_t SpiManager::read_single_external_reg(uint8_t sensorNum, uint8_t reg)
- {
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x81);
- HAL_Delay(1);
- return this->read_single_reg(sensorNum, ub_0, B0_EXT_SLV_SENS_DATA_00);
- }
- void SpiManager::write_single_external_reg(uint8_t sensorNum, uint8_t reg, uint8_t val)
- {
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, WRITE | MAG_SLAVE_ADDR);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_DO, val);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x81);
- }
- uint8_t* SpiManager::read_multiple_external_reg(uint8_t sensorNum, uint8_t reg, uint8_t len)
- {
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_ADDR, READ | MAG_SLAVE_ADDR);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_REG, reg);
- this->write_single_reg(sensorNum, ub_3, B3_I2C_SLV0_CTRL, 0x80 | len);
- HAL_Delay(1);
- return this->read_multiple_reg(sensorNum, ub_0, B0_EXT_SLV_SENS_DATA_00, len);
- }
|