| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #include "HAL_impl.h"
- // Funkcia na nastavenie CS pinu
- static inline void CS_Select(void) {
- HAL_GPIO_WritePin(CHIP_SELECT_PORT, CHIP_SELECT_PIN, GPIO_PIN_RESET);
- }
- static inline void CS_Deselect(void) {
- HAL_GPIO_WritePin(CHIP_SELECT_PORT, CHIP_SELECT_PIN, GPIO_PIN_SET);
- }
- /*---------------------------------------------------------------------*/
- /* SPI */
- /*---------------------------------------------------------------------*/
- void initiliaze_SPI(void)
- {
- CS_Deselect();
- uint8_t dummy = 0x00;
- HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
- }
- int spi_master_read_register(uint8_t reg, uint8_t* rbuffer, uint32_t rlen)
- {
- #ifdef HAL_SPI_MODULE_ENABLED
- uint8_t dummy = 0x00;
- uint8_t status = HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
- if (status != HAL_OK) return status;
- CS_Select();
- // 3. Adresovanie registra
- uint8_t cmd = (reg & 0x7F) | 0x80;
- status = HAL_SPI_Transmit(&SPI_INSTANCE, &cmd, 1, HAL_MAX_DELAY);
- // 4. Čítanie dát
- for (uint32_t indi = 0; indi < rlen; indi++) {
- uint8_t rx = 0x00;
- status = HAL_SPI_TransmitReceive(&SPI_INSTANCE, &rx, &rbuffer[indi], 1, HAL_MAX_DELAY);
- if (status != HAL_OK) {
- CS_Deselect();
- return status;
- }
- }
- // 5. Chip select HIGH
- CS_Deselect();
- #endif // HAL_SPI_MODULE_ENABLED
- return 0;
- }
- int spi_master_write_register(uint8_t reg, const uint8_t* wbuffer, uint32_t wlen)
- {
- #ifdef HAL_SPI_MODULE_ENABLED
- HAL_StatusTypeDef status;
- uint8_t dummy = 0x00;
- uint8_t addr = (reg & 0x7F) | 0x00;
- // 1. Dummy transfer (pôvodne SPI.transfer(0x00) mimo transakcie)
- status = HAL_SPI_Transmit(&SPI_INSTANCE, &dummy, 1, HAL_MAX_DELAY);
- if (status != HAL_OK) return -1;
- // 2. Chip Select LOW
- CS_Select();
- // 3. Odoslanie adresy registra
- status = HAL_SPI_Transmit(&SPI_INSTANCE, &addr, 1, HAL_MAX_DELAY);
- if (status != HAL_OK) {
- CS_Deselect();
- return -2;
- }
- // 4. Odoslanie všetkých dát
- if (wlen > 0) {
- status = HAL_SPI_Transmit(&SPI_INSTANCE, (uint8_t*)wbuffer, wlen, HAL_MAX_DELAY);
- if (status != HAL_OK) {
- CS_Deselect();
- return -3;
- }
- }
- // 5. Chip Select HIGH
- CS_Deselect();
- #endif // HAL_SPI_MODULE_ENABLED
- return 0;
- }
- /*---------------------------------------------------------------------*/
- /* I2C */
- /*---------------------------------------------------------------------*/
- void initiliaze_I2C(void)
- {
- #ifdef HAL_I2C_MODULE_ENABLED
- I2C_Address = I2C_ADDRESS;
- #endif
- }
- int i2c_master_write_register(uint8_t address, uint8_t reg, uint32_t len, const uint8_t *data)
- {
- #ifdef HAL_I2C_MODULE_ENABLED
- HAL_StatusTypeDef status = HAL_I2C_Mem_Write(
- &I2C_INSTANCE,
- (address << 1), // STM32 expects 8-bit address
- reg, // Register address
- I2C_MEMADD_SIZE_8BIT, // Register size
- (uint8_t *)data,
- len,
- HAL_MAX_DELAY
- );
- if (status != HAL_OK)
- {
- return -1;
- }
- #endif // HAL_I2C_MODULE_ENABLED
- return 0;
- }
- int i2c_master_read_register(uint8_t address, uint8_t reg, uint32_t len, uint8_t *buff)
- {
- #ifdef HAL_I2C_MODULE_ENABLED
- HAL_StatusTypeDef status = HAL_I2C_Mem_Read(
- &I2C_INSTANCE,
- (address << 1), // STM32 expects 8-bit address
- reg, // Register address
- I2C_MEMADD_SIZE_8BIT, // Register size
- buff,
- len,
- HAL_MAX_DELAY
- );
- if (status != HAL_OK)
- {
- return -1;
- }
- #endif // HAL_I2C_MODULE_ENABLED
- return 0;
- }
|