Commit 1648f85cd6d2cf3e0d85a54e2184c98d0e52f890
1 parent
0af9274f
I2C Finished
Showing
2 changed files
with
148 additions
and
0 deletions
Project/applications/smartcities/i2c.c
0 → 100644
1 | +#include <stm32f10x.h> | ||
2 | +#include <stm32f10x_i2c.h> | ||
3 | + | ||
4 | +void I2C1_init() | ||
5 | +{ | ||
6 | + GPIO_InitTypeDef GPIO_InitStruct; | ||
7 | + I2C_InitTypeDef I2C_InitStruct; | ||
8 | + | ||
9 | + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); | ||
10 | + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); | ||
11 | + | ||
12 | + /* | ||
13 | + * 1. SCL on PB6 or PB8 | ||
14 | + * 2. SDA on PB7 or PB9 | ||
15 | + */ | ||
16 | + | ||
17 | + GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_9; | ||
18 | + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_A | ||
19 | + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; | ||
20 | + GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; // set output to open drain | ||
21 | + GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // enable pull up resistors | ||
22 | + GPIO_Init(GPIOB, &GPIO_InitStruct); // init GPIOB | ||
23 | + | ||
24 | + /* WARNING | ||
25 | + * | ||
26 | + * Check consistency with above configuration | ||
27 | + * | ||
28 | + * --Imanol | ||
29 | + */ | ||
30 | + | ||
31 | + // Connect I2C1 pins to AF | ||
32 | + GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); // SCL | ||
33 | + GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1); // SDA | ||
34 | + | ||
35 | + // configure I2C1 | ||
36 | + I2C_InitStruct.I2C_ClockSpeed = 100000; // 100kHz - STANDARD MODE | ||
37 | + I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; | ||
38 | + I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; | ||
39 | + I2C_InitStruct.I2C_OwnAddress1 = 0x00; | ||
40 | + I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; | ||
41 | + I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; | ||
42 | + I2C_Init(I2C1, &I2C_InitStruct); | ||
43 | + I2C_Cmd(I2C1, ENABLE); | ||
44 | +} | ||
45 | + | ||
46 | +void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction) | ||
47 | +{ | ||
48 | + while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)) | ||
49 | + { | ||
50 | + // wait until I2C1 is not busy any more | ||
51 | + } | ||
52 | + I2C_GenerateSTART(I2Cx, ENABLE); | ||
53 | + | ||
54 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) | ||
55 | + { | ||
56 | + // wait for I2C1 EV5 --> Slave has acknowledged start condition | ||
57 | + } | ||
58 | + I2C_Send7bitAddress(I2Cx, address, direction); | ||
59 | + | ||
60 | + if(direction == I2C_Direction_Transmitter) | ||
61 | + { | ||
62 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) | ||
63 | + { | ||
64 | + // wait for I2Cx EV6, check if Slave has acknowledged Master transmitter mode | ||
65 | + } | ||
66 | + } | ||
67 | + else if(direction == I2C_Direction_Receiver) | ||
68 | + { | ||
69 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) | ||
70 | + { | ||
71 | + // wait for I2Cx EV6, check if Slave has acknowledged Master receiver mode | ||
72 | + } | ||
73 | + } | ||
74 | +} | ||
75 | + | ||
76 | +void I2C_write(I2C_TypeDef* I2Cx, uint8_t data) | ||
77 | +{ | ||
78 | + /* WARNING | ||
79 | + * | ||
80 | + * OJITO QUE ESTÁ ESPERANDO EL EV8 Y NO EL EV8_2 | ||
81 | + * | ||
82 | + * --Imanol | ||
83 | + */ | ||
84 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)) | ||
85 | + { | ||
86 | + // wait for I2C1 EV8 --> last byte is still being transmitted (last byte in SR, buffer empty), next byte can already be written | ||
87 | + } | ||
88 | + I2C_SendData(I2Cx, data); | ||
89 | +} | ||
90 | + | ||
91 | +uint8_t I2C_read_ack(I2C_TypeDef* I2Cx) | ||
92 | +{ | ||
93 | + I2C_AcknowledgeConfig(I2Cx, ENABLE); | ||
94 | + while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) | ||
95 | + { | ||
96 | + // wait until one byte has been received | ||
97 | + } | ||
98 | + return I2C_ReceiveData(I2Cx); | ||
99 | +} | ||
100 | + | ||
101 | +uint8_t I2C_read_nack(I2C_TypeDef* I2Cx) | ||
102 | +{ | ||
103 | + I2C_AcknowledgeConfig(I2Cx, DISABLE); | ||
104 | + I2C_GenerateSTOP(I2Cx, ENABLE); | ||
105 | + while( !I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) | ||
106 | + { | ||
107 | + // wait until one byte has been received | ||
108 | + } | ||
109 | + return I2C_ReceiveData(I2Cx); | ||
110 | +} | ||
111 | + | ||
112 | +void I2C_stop(I2C_TypeDef* I2Cx) | ||
113 | +{ | ||
114 | + I2C_GenerateSTOP(I2Cx, ENABLE); | ||
115 | + while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) | ||
116 | + { | ||
117 | + // wait for I2C1 EV8_2 --> byte has been transmitted | ||
118 | + } | ||
119 | +} | ||
120 | + | ||
121 | +/* SAMPLE CODE | ||
122 | + * | ||
123 | + * int main(void) | ||
124 | + * { | ||
125 | + * uint8_t received_data; | ||
126 | + * I2C1_init(); // initialize I2C peripheral | ||
127 | + * I2C_start(I2C1, SLAVE_ADDRESS<<1, I2C_Direction_Transmitter); // start a transmission in Master transmitter mode | ||
128 | + * I2C_write(I2C1, 0x01); // write one byte to the slave | ||
129 | + * I2C_stop(I2C1); // stop the transmission | ||
130 | + * I2C_start(I2C1, SLAVE_ADDRESS<<1, I2C_Direction_Receiver); // start a transmission in Master receiver mode | ||
131 | + * received_data = I2C_read_nack(I2C1); // read one byte and don't request another byte, stop transmission | ||
132 | + * while(1); | ||
133 | + * return 0; | ||
134 | + * } | ||
135 | + * --Imanol | ||
136 | + */ |
Project/applications/smartcities/include/i2c.h
0 → 100644
1 | +#ifndef I2C_H | ||
2 | +#define I2C_H | ||
3 | + | ||
4 | +void I2C1_init(); | ||
5 | +void I2C_start(I2C_TypeDef* I2Cx, uint8_t address, uint8_t direction); | ||
6 | +void I2C_stop(I2C_TypeDef* I2Cx); | ||
7 | +void I2C_write(I2C_TypeDef* I2Cx, uint8_t data); | ||
8 | +uint8_t I2C_read_ack(I2C_TypeDef* I2Cx); | ||
9 | +uint8_t I2C_read_nack(I2C_TypeDef* I2Cx); | ||
10 | + | ||
11 | +#endif | ||
12 | + |