38
+ − 1 #include "baseCPU2.h"
+ − 2 #include "i2c.h"
+ − 3 #include "scheduler.h"
+ − 4
+ − 5 /* Private typedef -----------------------------------------------------------*/
+ − 6 /* Private define ------------------------------------------------------------*/
+ − 7 /* Private macro -------------------------------------------------------------*/
+ − 8
+ − 9
+ − 10 // ===============================================================================
+ − 11 // I2C addresses - see i2c.h
165
+ − 12 // ===============================================================================
38
+ − 13
+ − 14 I2C_HandleTypeDef I2cHandle;
+ − 15
+ − 16
+ − 17 /*
+ − 18 static void I2C_Error_Handler(void)
+ − 19 {
+ − 20 while(1)
+ − 21 {
+ − 22 }
+ − 23 }
+ − 24 */
+ − 25
+ − 26 GPIO_PinState HAL_I2C_Read_Data_PIN(void)
+ − 27 {
+ − 28 return HAL_GPIO_ReadPin(I2Cx_SDA_GPIO_PORT,I2Cx_SDA_PIN);
+ − 29 }
+ − 30
+ − 31 void HAL_I2C_Send_One_CLOCK(void)
+ − 32 {
+ − 33 HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_RESET);
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 34 HAL_Delay(1);
38
+ − 35 HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_SET);
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 36 HAL_Delay(1);
38
+ − 37 }
+ − 38
+ − 39 GPIO_PinState MX_I2C1_TestAndClear(void)
+ − 40 {
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 41 GPIO_PinState retval;
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 42 uint8_t repeatcnt = 3;
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 43
38
+ − 44 I2C_DeInit();
+ − 45 HAL_I2C_ManualControl_MspInit();
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 46
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 47 /* The SDA line is expected to be HIGH if no com is pending => send dummy clock signals if that is not the case */
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 48 do
38
+ − 49 {
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 50 for(int i=0; i<20;i++)
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 51 {
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 52 if(HAL_I2C_Read_Data_PIN() == GPIO_PIN_RESET)
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 53 HAL_I2C_Send_One_CLOCK();
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 54 else
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 55 break;
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 56 }
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 57 retval = HAL_I2C_Read_Data_PIN();
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 58 }while ((repeatcnt-- > 0) && (retval != GPIO_PIN_SET));
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 59
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 60 return retval;
38
+ − 61 }
+ − 62
+ − 63 HAL_StatusTypeDef MX_I2C1_Init(void)
+ − 64 {
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 65 I2cHandle.Instance = I2Cx;
38
+ − 66 I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 67 I2cHandle.Init.ClockSpeed = 88000; /* Reduced to avoid behavior described in errata: Mismatch on the “Setup time for a repeated Start condition” */
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 68 I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 69 I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2; /* don't care if not in fast mode */
38
+ − 70 I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
+ − 71 I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 72 I2cHandle.Init.OwnAddress1 = 0x01; /* don't care because of master mode */
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 73
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 74 /* According to documentation setting filters before I2C initialization is recommended */
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 75 /* HAL_I2CEx_AnalogFilter_Config(&I2cHandle, I2C_ANALOGFILTER_ENABLED); */
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 76 HAL_I2CEx_ConfigDigitalFilter(&I2cHandle,0x0F);
38
+ − 77
+ − 78 global.I2C_SystemStatus = HAL_I2C_Init(&I2cHandle);
100
+ − 79
+ − 80 if(global.dataSendToSlavePending)
+ − 81 {
+ − 82 scheduleSpecial_Evaluate_DataSendToSlave();
+ − 83 }
241
+ − 84 return global.I2C_SystemStatus;
38
+ − 85 }
+ − 86
+ − 87
+ − 88 void I2C_DeInit(void)
+ − 89 {
+ − 90 HAL_I2C_DeInit(&I2cHandle);
+ − 91 }
+ − 92
239
+ − 93 static uint8_t i2c_errors = 0;
38
+ − 94
+ − 95 void I2C_Error_count(void)
+ − 96 {
+ − 97 i2c_errors++;
+ − 98 }
+ − 99
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 100
38
+ − 101 HAL_StatusTypeDef I2C_Master_Transmit( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
+ − 102 {
+ − 103 if(global.I2C_SystemStatus != HAL_OK)
238
a9d798e8c11f
cleanup, bugfix: do not mask I2C_SystemStatus with local variable
Jan Mulder <jlmulder@xs4all.nl>
diff
changeset
+ − 104 return global.I2C_SystemStatus;
38
+ − 105
328
4fe5400567e7
Set I2C speed to 88kHz, use digital filter only and reworked idle clock recovery
ideenmodellierer
diff
changeset
+ − 106 global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 10);
38
+ − 107 if(global.I2C_SystemStatus != HAL_OK)
+ − 108 {
+ − 109 I2C_Error_count();
+ − 110 }
88
+ − 111
241
+ − 112 return global.I2C_SystemStatus;
38
+ − 113 }
+ − 114
+ − 115 HAL_StatusTypeDef I2C_Master_Receive( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
+ − 116 {
+ − 117 if(global.I2C_SystemStatus != HAL_OK)
238
a9d798e8c11f
cleanup, bugfix: do not mask I2C_SystemStatus with local variable
Jan Mulder <jlmulder@xs4all.nl>
diff
changeset
+ − 118 return global.I2C_SystemStatus;
38
+ − 119
238
a9d798e8c11f
cleanup, bugfix: do not mask I2C_SystemStatus with local variable
Jan Mulder <jlmulder@xs4all.nl>
diff
changeset
+ − 120 global.I2C_SystemStatus = HAL_I2C_Master_Receive(&I2cHandle, DevAddress, pData, Size, 10);
a9d798e8c11f
cleanup, bugfix: do not mask I2C_SystemStatus with local variable
Jan Mulder <jlmulder@xs4all.nl>
diff
changeset
+ − 121 if(global.I2C_SystemStatus != HAL_OK)
38
+ − 122 {
+ − 123 I2C_Error_count();
+ − 124 }
+ − 125
238
a9d798e8c11f
cleanup, bugfix: do not mask I2C_SystemStatus with local variable
Jan Mulder <jlmulder@xs4all.nl>
diff
changeset
+ − 126 return global.I2C_SystemStatus;
38
+ − 127 }