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
|
|
12 ///
|
|
13 /// #define DEVICE_PRESSURE 0xEE (0x77) Write 0xEE Read 0xEF
|
|
14 /// #define DEVICE_COMPASS_HMC5883L 0x3C (0x1E) Write 0x3C Read 0x3D
|
|
15 /// #define DEVICE_ACCELARATOR_MMA8452Q 0x38 (0x1C) Write 0x38 Read 0x39
|
|
16 /// #define DEVICE_BATTERYGAUGE 0xC8 (0x64) Write 0xC8
|
|
17
|
|
18 /// #define DEVICE_COMPASS_303D 0x3C // 0x1E // x0011110 // SA0 to GND
|
|
19 ///
|
|
20 /// 0x6E 0x48 -> 0x6F 3d d1 86 3f 0x66 58
|
|
21 ///
|
|
22 // ===============================================================================
|
|
23 I2C_HandleTypeDef I2cHandle;
|
|
24
|
|
25
|
|
26 /*
|
|
27 static void I2C_Error_Handler(void)
|
|
28 {
|
|
29 while(1)
|
|
30 {
|
|
31 }
|
|
32 }
|
|
33 */
|
|
34
|
|
35 HAL_StatusTypeDef I2C1_Status(void)
|
|
36 {
|
|
37 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
38 }
|
|
39
|
|
40
|
|
41 GPIO_PinState HAL_I2C_Read_Data_PIN(void)
|
|
42 {
|
|
43 return HAL_GPIO_ReadPin(I2Cx_SDA_GPIO_PORT,I2Cx_SDA_PIN);
|
|
44 }
|
|
45
|
|
46 void HAL_I2C_Send_One_CLOCK(void)
|
|
47 {
|
|
48 HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_RESET);
|
|
49 HAL_Delay(10);
|
|
50 HAL_GPIO_WritePin(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_PIN, GPIO_PIN_SET);
|
|
51 HAL_Delay(10);
|
|
52 }
|
|
53
|
|
54 GPIO_PinState MX_I2C1_TestAndClear(void)
|
|
55 {
|
|
56 I2C_DeInit();
|
|
57 HAL_I2C_ManualControl_MspInit();
|
|
58 for(int i=0; i<9;i++)
|
|
59 {
|
|
60 if(HAL_I2C_Read_Data_PIN() == GPIO_PIN_RESET)
|
|
61 HAL_I2C_Send_One_CLOCK();
|
|
62 else
|
|
63 break;
|
|
64 }
|
|
65 return HAL_I2C_Read_Data_PIN();
|
|
66 }
|
|
67
|
|
68 HAL_StatusTypeDef MX_I2C1_Init(void)
|
|
69 {
|
|
70 I2cHandle.Instance = I2Cx;
|
|
71 I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
82
|
72 I2cHandle.Init.ClockSpeed = 400000;//400000;
|
38
|
73 I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
|
|
74 I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9;
|
|
75 I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
|
|
76 I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
|
|
77 I2cHandle.Init.OwnAddress1 = 0x01;
|
|
78
|
|
79 global.dataSendToSlaveStopEval = 1;
|
|
80
|
|
81 global.I2C_SystemStatus = HAL_I2C_Init(&I2cHandle);
|
82
|
82 HAL_I2CEx_AnalogFilter_Config(&I2cHandle, I2C_ANALOGFILTER_ENABLED);
|
|
83
|
38
|
84
|
|
85 global.dataSendToSlaveStopEval = 0;
|
|
86 if(global.dataSendToSlavePending)
|
|
87 {
|
|
88 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
89 }
|
|
90 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
91 }
|
|
92
|
|
93
|
|
94 void I2C_DeInit(void)
|
|
95 {
|
|
96 HAL_I2C_DeInit(&I2cHandle);
|
|
97 }
|
|
98
|
|
99
|
|
100 uint8_t i2c_errors = 0;
|
|
101
|
|
102 void I2C_Error_count(void)
|
|
103 {
|
|
104 i2c_errors++;
|
|
105 }
|
|
106
|
|
107
|
|
108 HAL_StatusTypeDef I2C_Master_TransmitNoStop( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
109 {
|
|
110 if(global.I2C_SystemStatus != HAL_OK)
|
|
111 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
112
|
|
113 global.dataSendToSlaveStopEval = 1;
|
|
114
|
|
115 global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 100 /*FIXME , 0*/);
|
|
116 if(global.I2C_SystemStatus != HAL_OK)
|
|
117 {
|
|
118 I2C_Error_count();
|
|
119 }
|
|
120 global.dataSendToSlaveStopEval = 0;
|
|
121 if(global.dataSendToSlavePending)
|
|
122 {
|
|
123 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
124 }
|
|
125 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
126 }
|
|
127
|
|
128
|
|
129 HAL_StatusTypeDef I2C_Master_Transmit( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
130 {
|
|
131 if(global.I2C_SystemStatus != HAL_OK)
|
|
132 return (HAL_StatusTypeDef)(global.I2C_SystemStatus & 0x03);
|
|
133
|
|
134
|
|
135 global.dataSendToSlaveStopEval = 1;
|
|
136
|
|
137 global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 100 /*FIXME , 1*/);
|
|
138 if(global.I2C_SystemStatus != HAL_OK)
|
|
139 {
|
|
140 I2C_Error_count();
|
|
141 }
|
|
142
|
|
143 global.dataSendToSlaveStopEval = 0;
|
|
144 if(global.dataSendToSlavePending)
|
|
145 {
|
|
146 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
147 }
|
|
148
|
|
149 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
150 }
|
|
151
|
|
152
|
|
153 HAL_StatusTypeDef I2C_Master_Receive( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
154 {
|
|
155 if(global.I2C_SystemStatus != HAL_OK)
|
|
156 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
157
|
|
158 uint8_t localHALstatusReturn = 0xFF;
|
|
159
|
|
160 global.dataSendToSlaveStopEval = 1;
|
|
161
|
|
162 localHALstatusReturn = HAL_I2C_Master_Receive(&I2cHandle, DevAddress, pData, Size, 100);
|
|
163 if(localHALstatusReturn != HAL_OK)
|
|
164 {
|
|
165 I2C_Error_count();
|
|
166 }
|
|
167
|
|
168 global.dataSendToSlaveStopEval = 0;
|
|
169 if(global.dataSendToSlavePending)
|
|
170 {
|
|
171 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
172 }
|
|
173 return (HAL_StatusTypeDef)localHALstatusReturn;
|
|
174 }
|
|
175
|