von
HeikoP (Gast)
14.01.2011 17:19
Hallo.
Ich versuche vom SRF02 (Ultraschallsensor) aus den Registern zu lesen
oder drauf zu schreiben, aber irgendwie funktioniert das nicht. Leider
findet man auch im Netz nicht sehr viel zu I2C und dem STM32 VL
Discovery.
Vielleicht kann jemand nen Tip geben, wo der Fehler liegt.
Vielen Dank
1 #include "stm32F10x.h"
2 #include "STM32vldiscovery.h"
3
4 #define I2C1_SLAVE_ADDRESS7 0xE0 // Sensor I2C Address
5 #define ClockSpeed 200000 // 200 KHz
6 #define BufferSize1 (countof(Tx1_Buffer)-1)
7
8 void send ( u8 * daten , int maxl )
9 {
10 int i ;
11 /* Send I2C1 START condition */
12 I2C_GenerateSTART ( I2C1 , ENABLE );
13
14 /* Test on I2C1 EV5 and clear it */
15 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_MODE_SELECT ));
16
17 /* Send slave Address for write */
18 I2C_Send7bitAddress ( I2C1 , I2C1_SLAVE_ADDRESS7 , I2C_Direction_Transmitter );
19
20 /* Test on I2C1 EV6 and clear it */
21 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ));
22
23 /* Send I2C1 slave internal address */
24 for ( i = 0 ; i < maxl ; i ++ )
25 {
26 I2C_SendData ( I2C1 , daten [ i ]);
27
28 /* Test on I2C1 EV8 and clear it */
29 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
30 }
31 /* Send I2C1 STOP Condition */
32 I2C_GenerateSTOP ( I2C1 , ENABLE );
33 }
34
35 int main ( void )
36 {
37 char daten [ 5 ] = { 0x00 , 0xA0 , 0xAA , 0xA5 , 0xE2 };
38 u8 Tx1_Buffer [] = "/* STM32F10x I2C Firmware " ;
39 u8 Tx2_Buffer [] = "Library Example */" ;
40 u8 Rx1_Buffer [ 10 ];
41 u8 * pBuffer = Rx1_Buffer ;
42 u8 test = 0 ;
43
44 GPIO_InitTypeDef GPIO_InitStructure ;
45 I2C_InitTypeDef I2C_InitStructure ;
46
47 /* Enable I2C1 -------------------------------------------------------------*/
48 I2C_Cmd ( I2C1 , ENABLE );
49
50 /* I2C1 configuration ------------------------------------------------------*/
51 I2C_InitStructure . I2C_Mode = I2C_Mode_I2C ;
52 I2C_InitStructure . I2C_DutyCycle = I2C_DutyCycle_2 ;
53 I2C_InitStructure . I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7 ;
54 I2C_InitStructure . I2C_Ack = I2C_Ack_Enable ;
55 I2C_InitStructure . I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit ;
56 I2C_InitStructure . I2C_ClockSpeed = ClockSpeed ;
57 I2C_Init ( I2C1 , & I2C_InitStructure );
58
59 /* GPIOB Periph clock enable */
60 RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB , ENABLE );
61
62 /* I2C1 and I2C2 Periph clock enable */
63 RCC_APB1PeriphClockCmd ( RCC_APB1Periph_I2C1 , ENABLE );
64
65 /* Configure I2C1 pins: SCL and SDA ----------------------------------------*/
66 GPIO_InitStructure . GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
67 GPIO_InitStructure . GPIO_Speed = GPIO_Speed_50MHz ;
68 GPIO_InitStructure . GPIO_Mode = GPIO_Mode_AF_OD ; // Open Drain, I2C bus pulled high externally
69 GPIO_Init ( GPIOB , & GPIO_InitStructure );
70
71 //Daten Senden*****************************************************
72
73 send ( daten , 5 );
74 }
von
HeikoP (Gast)
15.01.2011 20:17
Also Senden funktioniert (ersichtlich an der LED auf dem SRF02).
Das Problem ist aber weiterhin das Lesen.
1 // Daten lesen
2 void read ()
3 {
4 u8 ReceivedData ;
5 /*!< While the bus is busy */
6 while ( I2C_GetFlagStatus ( I2C1 , I2C_FLAG_BUSY ))
7 {
8 }
9
10 /*!< Send START condition */
11 I2C_GenerateSTART ( I2C1 , ENABLE );
12
13 /*!< Test on EV5 and clear it */
14 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_MODE_SELECT ))
15 {
16 }
17
18 /*!< Send EEPROM address for write */
19 I2C_Send7bitAddress ( I2C1 , I2C1_SLAVE_ADDRESS7 , I2C_Direction_Transmitter );
20
21 /*!< Test on EV6 and clear it */
22 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ))
23 {
24 }
25
26 //send the reg select COMMAND byte
27 I2C_SendData ( I2C1 , 2 );
28
29 /*!< Test on EV8 and clear it */
30 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ))
31 {
32 }
33
34 //send START condition a second time
35 I2C_GenerateSTART ( I2C1 , ENABLE );
36
37 /*!< Test on EV5 and clear it */
38 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_MODE_SELECT ))
39 {
40 }
41
42 /*!< Send EEPROM address for read */
43 I2C_Send7bitAddress ( I2C1 , I2C1_SLAVE_ADDRESS7 , I2C_Direction_Receiver );
44
45 /*!< Test on EV6 and clear it */
46 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ))
47 {
48 }
49
50 // /*!< Test on EV7 and clear it */
51 if ( I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_RECEIVED ))
52 {
53 /*!< Read a byte from the EEPROM */
54 ReceivedData = I2C_ReceiveData ( I2C1 );
55 }
56
57 /*!< Disable Acknowledgement */
58 I2C_AcknowledgeConfig ( I2C1 , DISABLE );
59
60 /*!< Send STOP Condition */
61 I2C_GenerateSTOP ( I2C1 , ENABLE );
62
63 /*!< Enable Acknowledgement to be ready for another reception */
64 I2C_AcknowledgeConfig ( I2C1 , ENABLE );
65 }
Hat jemand eine Ahnung, warum da nix ausgelesen wird?
von
HeikoP (Gast)
15.01.2011 20:38
Hab jetzt mal versucht die Slave-ID zu ändern, aber irgendwie klappt das
nicht.
1 void send ( void )
2 {
3 //int i;
4 while ( I2C_GetFlagStatus ( I2C1 , I2C_FLAG_BUSY ));
5 // sende START
6 I2C_GenerateSTART ( I2C1 , ENABLE );
7
8 // Test ob I2C1 EV5 und clear
9 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_MODE_SELECT ));
10
11 // Sende Slaveadresse und Mode TRANSMIT
12 I2C_Send7bitAddress ( I2C1 , I2C1_SLAVE_ADDRESS7 , I2C_Direction_Transmitter );
13
14 // Test ob I2C1 EV6 und clear
15 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ));
16
17 // Send interne Slave-Adresse
18 I2C_SendData ( I2C1 , 0x00 );
19
20 // Test ob I2C1 EV8 und clear
21 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
22
23 // Send Befehl
24 I2C_SendData ( I2C1 , 0xA0 );
25
26 // Test ob I2C1 EV8 und clear
27 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
28
29 // Send Befehl
30 I2C_SendData ( I2C1 , 0xAA );
31
32 // Test ob I2C1 EV8 und clear
33 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
34
35 // Send Befehl
36 I2C_SendData ( I2C1 , 0xA5 );
37
38 // Test ob I2C1 EV8 und clear
39 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
40
41 // Send Befehl
42 I2C_SendData ( I2C1 , 0xE2 );
43
44 // Test ob I2C1 EV8 und clear
45 while ( ! I2C_CheckEvent ( I2C1 , I2C_EVENT_MASTER_BYTE_TRANSMITTED ));
46
47 // Send I2C1 STOP Condition
48 I2C_GenerateSTOP ( I2C1 , ENABLE );
49 }
Hat jemand eine Idee, wo der Fehler liegt?
Also ich sitz selber grad an dem Thema mit I2C. Deswegen bin ich nicht
der Vollprofi. Aber warum initialisierst du das Modul mit folgendem
Befehl: 1 I2C_InitStructure . I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7 ;
das heißt du gibt dem µC diese Adresse als eigene adresse,
und anschließend probierst du von dieser adresse zu schreiben/lesen:
1 I2C_Send7bitAddress ( I2C1 , I2C1_SLAVE_ADDRESS7 , I2C_Direction_Transmitter );
für mich sieht das merkwürdig aus :)
grüße Tarkan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.