1 | double Transmission(void)
|
2 | {
|
3 |
|
4 | double grad=0.0;
|
5 | vu8 d1=0;
|
6 | vu8 d2=0;
|
7 | double d1_double,d2_double;
|
8 | vu16 daten=0;
|
9 |
|
10 |
|
11 | /* Enable I2C1 ----------------------------------------------------*/
|
12 | I2C_Cmd(I2C1, ENABLE);
|
13 |
|
14 |
|
15 |
|
16 | /* I2C1 configuration: SMBus Host ------------------------------------------*/
|
17 | I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost;
|
18 | I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
19 | I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
|
20 | I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
21 | I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
22 | I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
|
23 | I2C_Init(I2C1, &I2C_InitStructure);
|
24 |
|
25 |
|
26 | /* Enable I2C2 ARP */
|
27 | I2C_ARPCmd(I2C2, ENABLE);
|
28 |
|
29 | /* Enable I2C1 and I2C2 PEC Transmission */
|
30 | I2C_CalculatePEC(I2C1, ENABLE);
|
31 | I2C_CalculatePEC(I2C2, ENABLE);
|
32 |
|
33 | /*----- Transmission Phase -----*/
|
34 | /* Send I2C1 START condition */
|
35 | I2C_GenerateSTART(I2C1, ENABLE);
|
36 | /* Test on I2C1 EV5 and clear it */
|
37 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
|
38 | /* Send Slave address */
|
39 | I2C_Send7bitAddress(I2C1, SMBusDefaultHeader, I2C_Direction_Transmitter);
|
40 | /* Test on I2C1 EV6 and clear it */
|
41 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
|
42 |
|
43 | /* Get I2C2 SMBDEFAULT flag status */
|
44 | Status = I2C_GetFlagStatus(I2C2, I2C_FLAG_SMBDEFAULT); //wird evtl. nicht benötigt
|
45 | /* Send Command */
|
46 | I2C_SendData(I2C1, Command);
|
47 | /* Clear ADDR flag */
|
48 | I2C_ClearFlag(I2C2, I2C_FLAG_ADDR);
|
49 |
|
50 | /* Send I2C1 START condition */
|
51 | I2C_GenerateSTART(I2C1, ENABLE);
|
52 | /* Test on I2C1 EV5 and clear it */
|
53 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
|
54 | /* Send Slave address */
|
55 | I2C_Send7bitAddress(I2C1, SMBusDefaultHeader, I2C_Direction_Receiver);
|
56 | /* Test on I2C1 EV6 and clear it */
|
57 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
|
58 | /* Wait for I2C1 received data */
|
59 | while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE));
|
60 | /* Store received data on I2C1 */
|
61 | ReceivedCommand = I2C_ReceiveData(I2C1); //LSB Byte
|
62 | d1= ReceivedCommand; //Zwischenspreicherung in vu8
|
63 | d1_double=(double)d1; //Konvertierung in double ; Konvertierung in int funktioniert nicht
|
64 |
|
65 | /* Wait for I2C1 received data */
|
66 | while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE));
|
67 | /* Store received data on I2C1 */
|
68 | ReceivedCommand = I2C_ReceiveData(I2C1); //MSB Byte
|
69 | d2=ReceivedCommand;
|
70 | d2_double=(double)d2;
|
71 |
|
72 | //16Bit unsigned char
|
73 | daten =d1;
|
74 | daten|=(d2<<8);
|
75 |
|
76 | //Umrechnung in Grad Celsius
|
77 | grad=d2_double*256+d1_double;
|
78 | grad/=50.0;
|
79 | grad-=273.15;
|
80 |
|
81 | /* Enable Transfer PEC next for I2C1 */
|
82 | I2C_TransmitPEC(I2C1, ENABLE);
|
83 | /* Wait for I2C1 received data */
|
84 | while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE));
|
85 | /* Store received PEC on I2C1 */
|
86 | PECValue = I2C_ReceiveData(I2C1);
|
87 | /* Test on I2C1 EV8 and clear it */
|
88 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
|
89 |
|
90 | /* Send I2C1 STOP Condition */
|
91 | I2C_GenerateSTOP(I2C1, ENABLE);
|
92 | /* Test on I2C1 EV4 and clear it */
|
93 | while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED ));
|
94 | /* Clear I2C1 STOPF flag */
|
95 | I2C_ClearFlag(I2C1, I2C_FLAG_STOPF);
|
96 |
|
97 | return grad;
|
98 | }
|