comparison Small_CPU/Src/i2c.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children a6f0881074a4
comparison
equal deleted inserted replaced
37:ccc45c0e1ea2 38:5f11787b4f42
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