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 }
|