1 | void i2c2_init()
|
2 | {
|
3 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
|
4 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
|
5 |
|
6 | GPIO_InitTypeDef GPIO_InitStructure;
|
7 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
|
8 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
9 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
|
10 |
|
11 | GPIO_Init(GPIOB, &GPIO_InitStructure);
|
12 |
|
13 | I2C_DeInit(I2C2);
|
14 |
|
15 | I2C_InitTypeDef I2C_InitStructure;
|
16 | I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
17 | I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
18 | I2C_InitStructure.I2C_OwnAddress1 = 0;
|
19 | I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
|
20 | I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
21 | I2C_InitStructure.I2C_ClockSpeed = 200;
|
22 |
|
23 | I2C_Init(I2C2,&I2C_InitStructure);
|
24 | I2C_Cmd(I2C2, ENABLE);
|
25 | }
|
26 |
|
27 |
|
28 | void PCA8575_setze_Ausgang(int16_t Ausgangsdaten, uint8_t Adresse)
|
29 | {
|
30 | uint8_t first_data_byte = (uint8_t)(Ausgangsdaten >> 8);
|
31 | uint8_t second_data_byte = (uint8_t)Ausgangsdaten;
|
32 | uint8_t slave_adress = (0x4 << 4) | (Adresse << 1) | (0);
|
33 |
|
34 |
|
35 | //warte auf I2C
|
36 | while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
|
37 | //Start
|
38 | I2C_GenerateSTART(I2C2, ENABLE);
|
39 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
|
40 | //Adresse
|
41 | I2C_Send7bitAddress(I2C2, slave_adress, I2C_Direction_Transmitter);
|
42 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //EV6 lesen und löschen
|
43 |
|
44 | //Daten senden
|
45 | I2C_SendData(I2C2, first_data_byte);
|
46 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
|
47 |
|
48 | //Daten senden
|
49 | I2C_SendData(I2C2, second_data_byte);
|
50 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
|
51 |
|
52 | I2C_AcknowledgeConfig(I2C2, ENABLE);
|
53 | I2C_GenerateSTOP(I2C2,ENABLE);
|
54 | }
|
55 |
|
56 | void PCA8575_lese_Eingang(uint8_t Adresse)
|
57 | {
|
58 | uint8_t slave_adress = (0x4 << 4) | (Adresse << 1) | (1);
|
59 | uint8_t Buffer_RX[4] = {0};
|
60 |
|
61 | //warte auf I2C
|
62 | while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
|
63 | //Start
|
64 | I2C_GenerateSTART(I2C2, ENABLE);
|
65 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
|
66 | //Adresse
|
67 | I2C_Send7bitAddress(I2C2, slave_adress, I2C_Direction_Receiver);
|
68 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //EV6 lesen und löschen
|
69 |
|
70 | //Daten empfangen
|
71 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_SLAVE_BYTE_RECEIVED));
|
72 | Buffer_RX[0]=I2C_ReceiveData(I2C2);//daten 1
|
73 | I2C_AcknowledgeConfig(I2C2, ENABLE);
|
74 |
|
75 | while(!I2C_CheckEvent(I2C2, I2C_EVENT_SLAVE_BYTE_RECEIVED));
|
76 | Buffer_RX[1]=I2C_ReceiveData(I2C2);//daten 2
|
77 |
|
78 | I2C_AcknowledgeConfig(I2C2, ENABLE);
|
79 | I2C_GenerateSTOP(I2C2,ENABLE);
|
80 |
|
81 | }
|