Robert_l

i2c3 reset

Jan 21st, 2021
714
133 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * reset_i2c.c
  3.  *
  4.  *  Created on: Dec 31, 2020
  5.  *      Author: Ja
  6.  */
  7. #include "main.h"
  8. #include "reset_i2c.h"
  9. #include "stdbool.h"
  10.  
  11. #include "uartModule.h"
  12. // from HAL_I2C_MspInit in src
  13.  
  14.  
  15. //#include "delay.h"
  16. void delayUs(int16_t us) {
  17.     volatile uint8_t delaytmp = 0;
  18.     volatile uint32_t delay = us * (SystemCoreClock / 10U / 1000U / 1000U);
  19.     while (--delay) {
  20.         delaytmp++;
  21.     }
  22. }
  23.  
  24. void delayMs(int32_t ms) {
  25.     BaseType_t shedulerState = xTaskGetSchedulerState();
  26.     if (shedulerState == taskSCHEDULER_RUNNING) {
  27.         vTaskDelay(ms);
  28.     } else {
  29.         HAL_Delay(ms);
  30.     }
  31. }
  32.  
  33.  
  34.  
  35. void gpioSendStop() {
  36.     GPIO_InitTypeDef GPIO_InitStruct = { 0 };
  37.     uint8_t err = 0;
  38.     uint16_t timeout = 100;
  39.  
  40.     __HAL_RCC_GPIOC_CLK_ENABLE();
  41.     __HAL_RCC_GPIOA_CLK_ENABLE();
  42.     /**I2C3 GPIO Configuration
  43.      PC9     ------> I2C3_SDA
  44.      PA8     ------> I2C3_SCL
  45.      */
  46.  
  47.     do {
  48.  
  49.         GPIO_InitStruct.Pin = I2C3_SCL_Pin;
  50.         GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  51.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  52.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  53.         GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  54.         HAL_GPIO_Init(I2C3_SCL_GPIO_Port, &GPIO_InitStruct);
  55.         HAL_GPIO_WritePin(I2CRST_SCL_PORT, I2CRST_SCL_PIN, GPIO_PIN_SET);
  56.  
  57.         delayUs(500);
  58.  
  59.         GPIO_InitStruct.Pin = I2C3_SDA_Pin;
  60.         GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  61.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  62.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  63.         GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  64.         HAL_GPIO_Init(I2C3_SDA_GPIO_Port, &GPIO_InitStruct);
  65.  
  66.         //send stop
  67.         HAL_GPIO_WritePin(I2CRST_SDA_PORT, I2CRST_SDA_PIN, GPIO_PIN_RESET);
  68.         delayUs(500);
  69.         HAL_GPIO_WritePin(I2CRST_SDA_PORT, I2CRST_SDA_PIN, GPIO_PIN_SET);
  70.         //send clock
  71.         for (int i = 0; i < 8; i++) {
  72.             delayUs(20);
  73.             HAL_GPIO_WritePin(I2CRST_SCL_PORT, I2CRST_SCL_PIN, GPIO_PIN_RESET);
  74.             delayUs(20);
  75.             HAL_GPIO_WritePin(I2CRST_SCL_PORT, I2CRST_SCL_PIN, GPIO_PIN_SET);
  76.         }
  77.         //send stop
  78.         delayUs(200);
  79.         HAL_GPIO_WritePin(I2CRST_SDA_PORT, I2CRST_SDA_PIN, GPIO_PIN_RESET);
  80.         delayUs(200);
  81.         HAL_GPIO_WritePin(I2CRST_SDA_PORT, I2CRST_SDA_PIN, GPIO_PIN_SET);
  82.  
  83.         //check gpio state
  84.         GPIO_InitStruct.Pin = I2C3_SDA_Pin;
  85.         GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  86.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  87.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  88.         GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  89.         HAL_GPIO_Init(I2C3_SDA_GPIO_Port, &GPIO_InitStruct);
  90.  
  91.         GPIO_InitStruct.Pin = I2C3_SCL_Pin;
  92.         GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  93.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  94.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  95.         GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
  96.         HAL_GPIO_Init(I2C3_SCL_GPIO_Port, &GPIO_InitStruct);
  97.         delayUs(200);
  98.  
  99.         if (HAL_GPIO_ReadPin(I2CRST_SDA_PORT, I2CRST_SDA_PIN)
  100.                 == GPIO_PIN_RESET) {
  101.             err = 1;
  102.             uartSendString("err sda low");
  103.         }
  104.         if (HAL_GPIO_ReadPin(I2CRST_SCL_PORT, I2CRST_SCL_PIN)
  105.                 == GPIO_PIN_RESET) {
  106.             err = 2;
  107.             uartSendString("err scl low");
  108.         }
  109.     } while (err && --timeout);
  110. }
  111.  
  112. HAL_StatusTypeDef reset_i2c(bool force) {
  113.     I2C_HandleTypeDef *hi2c = &I2CRST_HANDLE;
  114.  
  115.     bool doReset = force;
  116.     if (hi2c->State == HAL_I2C_STATE_RESET
  117.             || hi2c->State == HAL_I2C_STATE_TIMEOUT
  118.             || hi2c->State == HAL_I2C_STATE_ERROR)
  119.         doReset = true;
  120.  
  121.     if (hi2c->State == HAL_I2C_STATE_READY) {
  122.         if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET)
  123.             doReset = true;
  124.     }
  125.     if (doReset) {
  126.         uartSendString("i2c reseting\n");
  127.         HAL_I2C_DeInit(hi2c);
  128.         gpioSendStop();
  129.         if (HAL_I2C_Init(&hi2c3) != HAL_OK) {
  130.             Error_Handler();
  131.         }
  132.     }
  133.     return HAL_OK;
  134. }
  135.  
RAW Paste Data