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;
|
|
72 I2cHandle.Init.ClockSpeed = 100000;//400000;
|
|
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
|
|
83 global.dataSendToSlaveStopEval = 0;
|
|
84 if(global.dataSendToSlavePending)
|
|
85 {
|
|
86 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
87 }
|
|
88 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
89 }
|
|
90
|
|
91
|
|
92 void I2C_DeInit(void)
|
|
93 {
|
|
94 HAL_I2C_DeInit(&I2cHandle);
|
|
95 }
|
|
96
|
|
97
|
|
98 uint8_t i2c_errors = 0;
|
|
99
|
|
100 void I2C_Error_count(void)
|
|
101 {
|
|
102 i2c_errors++;
|
|
103 }
|
|
104
|
|
105
|
|
106 HAL_StatusTypeDef I2C_Master_TransmitNoStop( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
107 {
|
|
108 if(global.I2C_SystemStatus != HAL_OK)
|
|
109 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
110
|
|
111 global.dataSendToSlaveStopEval = 1;
|
|
112
|
|
113 global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 100 /*FIXME , 0*/);
|
|
114 if(global.I2C_SystemStatus != HAL_OK)
|
|
115 {
|
|
116 I2C_Error_count();
|
|
117 }
|
|
118 global.dataSendToSlaveStopEval = 0;
|
|
119 if(global.dataSendToSlavePending)
|
|
120 {
|
|
121 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
122 }
|
|
123 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
124 }
|
|
125
|
|
126
|
|
127 HAL_StatusTypeDef I2C_Master_Transmit( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
128 {
|
|
129 if(global.I2C_SystemStatus != HAL_OK)
|
|
130 return (HAL_StatusTypeDef)(global.I2C_SystemStatus & 0x03);
|
|
131
|
|
132
|
|
133 global.dataSendToSlaveStopEval = 1;
|
|
134
|
|
135 global.I2C_SystemStatus = HAL_I2C_Master_Transmit(&I2cHandle, DevAddress, pData, Size, 100 /*FIXME , 1*/);
|
|
136 if(global.I2C_SystemStatus != HAL_OK)
|
|
137 {
|
|
138 I2C_Error_count();
|
|
139 }
|
|
140
|
|
141 global.dataSendToSlaveStopEval = 0;
|
|
142 if(global.dataSendToSlavePending)
|
|
143 {
|
|
144 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
145 }
|
|
146
|
|
147 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
148 }
|
|
149
|
|
150
|
|
151 HAL_StatusTypeDef I2C_Master_Receive( uint16_t DevAddress, uint8_t *pData, uint16_t Size)
|
|
152 {
|
|
153 if(global.I2C_SystemStatus != HAL_OK)
|
|
154 return (HAL_StatusTypeDef)global.I2C_SystemStatus;
|
|
155
|
|
156 uint8_t localHALstatusReturn = 0xFF;
|
|
157
|
|
158 global.dataSendToSlaveStopEval = 1;
|
|
159
|
|
160 localHALstatusReturn = HAL_I2C_Master_Receive(&I2cHandle, DevAddress, pData, Size, 100);
|
|
161 if(localHALstatusReturn != HAL_OK)
|
|
162 {
|
|
163 I2C_Error_count();
|
|
164 }
|
|
165
|
|
166 global.dataSendToSlaveStopEval = 0;
|
|
167 if(global.dataSendToSlavePending)
|
|
168 {
|
|
169 scheduleSpecial_Evaluate_DataSendToSlave();
|
|
170 }
|
|
171 return (HAL_StatusTypeDef)localHALstatusReturn;
|
|
172 }
|
|
173
|