Commit 176fff61776dbd44a99906e3f61d76269494c0c5
1 parent
954a88db
--no commit message
Showing
3 changed files
with
65 additions
and
4 deletions
Project/applications/smartcities/i2c.c
1 | #include "i2c.h" | 1 | #include "i2c.h" |
2 | -#include "libwismart.h" | ||
3 | 2 | ||
4 | void I2C_init(void) | 3 | void I2C_init(void) |
5 | { | 4 | { |
@@ -110,6 +109,58 @@ void I2C_stop(I2C_TypeDef* I2Cx) | @@ -110,6 +109,58 @@ void I2C_stop(I2C_TypeDef* I2Cx) | ||
110 | } | 109 | } |
111 | } | 110 | } |
112 | 111 | ||
112 | +uint8_t I2C_check(I2C_TypeDef* I2Cx, uint8_t address) | ||
113 | +{ | ||
114 | + printf("I2C busy...\r\n"); | ||
115 | + while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)) | ||
116 | + { | ||
117 | + // wait until I2C1 is not busy any more | ||
118 | + } | ||
119 | + printf("I2C ready...\r\n"); | ||
120 | + I2C_GenerateSTART(I2Cx, ENABLE); | ||
121 | + printf("START RELEASED...\r\n"); | ||
122 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) | ||
123 | + { | ||
124 | + // wait for I2C1 EV5 --> Slave has acknowledged start condition | ||
125 | + } | ||
126 | + printf("Probing address %x ...\r\n",address); | ||
127 | + I2C_Send7bitAddress(I2Cx, address, I2C_Direction_Transmitter); | ||
128 | + chThdSleepMilliseconds(SCAN_TIMEOUT); | ||
129 | + if(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) | ||
130 | + { | ||
131 | + printf("I2C address not detected: %x\r\n", address); | ||
132 | + return 1; | ||
133 | + } | ||
134 | + printf("I2C address detected: %x\r\n", address); | ||
135 | + I2C_write(I2C1,0x00); | ||
136 | + I2C_stop(I2C1); | ||
137 | + return 0; | ||
138 | + /*while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) | ||
139 | + { | ||
140 | + // wait for I2Cx EV6, check if Slave has acknowledged Master receiver mode | ||
141 | + }*/ | ||
142 | +} | ||
143 | + | ||
144 | +void I2C_scan(uint8_t *addresses) | ||
145 | +{ | ||
146 | + uint8_t sensors[TOTAL_SENSORS] = {DISTANCE_ADDR,LIGHT_ADDR,PRESSURE_ADDR,HUMIDITY_TEMP_ADDR}; | ||
147 | + uint8_t i, j = 0; | ||
148 | + for(i = 0; i < TOTAL_SENSORS; i++) | ||
149 | + { | ||
150 | + if(!I2C_check(I2C1,sensors[i] << 1)) | ||
151 | + { | ||
152 | + printf("adding...\r\n"); | ||
153 | + addresses[j++] = sensors[i]; | ||
154 | + } | ||
155 | + else | ||
156 | + { | ||
157 | + I2C_SoftwareResetCmd(I2C1, ENABLE); | ||
158 | + I2C_DeInit(I2C1); | ||
159 | + I2C_init(); | ||
160 | + } | ||
161 | + } | ||
162 | +} | ||
163 | + | ||
113 | /* SAMPLE CODE BMP-085 | 164 | /* SAMPLE CODE BMP-085 |
114 | * | 165 | * |
115 | uint16_t received_data; | 166 | uint16_t received_data; |
Project/applications/smartcities/include/i2c.h
@@ -4,6 +4,10 @@ | @@ -4,6 +4,10 @@ | ||
4 | #include "stm32f10x.h" | 4 | #include "stm32f10x.h" |
5 | #include "stm32f10x_i2c.h" | 5 | #include "stm32f10x_i2c.h" |
6 | #include "stm32f10x_gpio.h" | 6 | #include "stm32f10x_gpio.h" |
7 | +#include "sensors.h" | ||
8 | +#include "libwismart.h" | ||
9 | + | ||
10 | +#define SCAN_TIMEOUT 100 | ||
7 | 11 | ||
8 | void I2C_init(void); | 12 | void I2C_init(void); |
9 | void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction); | 13 | void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction); |
@@ -11,6 +15,9 @@ void I2C_stop(I2C_TypeDef* I2Cx); | @@ -11,6 +15,9 @@ void I2C_stop(I2C_TypeDef* I2Cx); | ||
11 | void I2C_write(I2C_TypeDef* I2Cx, uint8_t data); | 15 | void I2C_write(I2C_TypeDef* I2Cx, uint8_t data); |
12 | uint8_t I2C_read_ack(I2C_TypeDef* I2Cx); | 16 | uint8_t I2C_read_ack(I2C_TypeDef* I2Cx); |
13 | uint8_t I2C_read_nack(I2C_TypeDef* I2Cx); | 17 | uint8_t I2C_read_nack(I2C_TypeDef* I2Cx); |
18 | +void I2C_scan(uint8_t *addresses); | ||
19 | +uint8_t I2C_check(I2C_TypeDef* I2Cx, uint8_t address); | ||
20 | + | ||
14 | 21 | ||
15 | #endif | 22 | #endif |
16 | 23 |
Project/applications/smartcities/include/sensors.h
@@ -8,9 +8,12 @@ | @@ -8,9 +8,12 @@ | ||
8 | #include "module.h" | 8 | #include "module.h" |
9 | //#include "json.h" | 9 | //#include "json.h" |
10 | 10 | ||
11 | -#define LIGHT_ADDR 0x39 | ||
12 | -#define DISTANCE_ADDR 0x01 | ||
13 | -#define PRESSURE_ADDR 0x77 | 11 | +#define LIGHT_ADDR 0x39 |
12 | +#define DISTANCE_ADDR 0x01 | ||
13 | +#define PRESSURE_ADDR 0x77 | ||
14 | +#define HUMIDITY_TEMP_ADDR 0x00 | ||
15 | +//REMEMBER TO UPDATE I2C_scan ROUTINE WITH EACH NEW SENSOR!!!! | ||
16 | +#define TOTAL_SENSORS 4 | ||
14 | 17 | ||
15 | typedef struct { | 18 | typedef struct { |
16 | uint8_t ID; | 19 | uint8_t ID; |