habe - mal wieder - ein problem mit stm. Ein si47303-fm-modul läuft am
avr.
Beim ARM klappt irgendwie das Lesenn nicht:
1 | // Read all registers from Si4703
|
2 | void Si4703_Read(void) {
|
3 | uint8_t i;
|
4 | uint8_t buffer[32]; // 16 of 16-bit registers
|
5 |
|
6 | I2C_AcknowledgeConfig(I2C_PORT,ENABLE); // Enable I2C acknowledge
|
7 | I2C_GenerateSTART(I2C_PORT,ENABLE); // Send START condition
|
8 | while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)); // Wait for EV5
|
9 | I2C_Send7bitAddress(I2C_PORT,Si4703_ADDR,I2C_Direction_Receiver); // Send slave address for READ
|
10 |
|
11 | while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // Wait for EV6
|
12 |
|
13 | // Si4703 read start from r0Ah register
|
14 | for (i = 0x14; ; i++) {
|
15 | if (i == 0x20) i = 0x00;
|
16 | while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RECEIVED)); // Wait for EV7 (Byte received from slave)
|
17 | buffer[i] = I2C_ReceiveData(I2C_PORT); // Receive byte
|
18 | if (i == 0x12) break;
|
19 | }
|
20 | I2C_AcknowledgeConfig(I2C_PORT,DISABLE); // Disable I2C acknowledgment
|
21 | I2C_GenerateSTOP(I2C_PORT,ENABLE); // Send STOP condition
|
22 | while (!I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RECEIVED)); // Wait for EV7 (Byte received from slave)
|
23 | buffer[i++] = I2C_ReceiveData(I2C_PORT); // Receive last byte
|
24 |
|
25 | for (i = 0; i < 16; i++) {
|
26 | Si4703_REGs[i] = (buffer[i<<1] << 8) | buffer[(i<<1)+1];
|
27 | }
|
28 | }
|
bei I2C_CheckEvent hängt es sich auf. Entweder vom Modul kommt nichts
zurück oder der code stimmt nicht.
Da ein i2c-Lcd an der gleichen Schnittstelle funktioniert und da das
modul am avr geht, könnte es am code liegen.
Jemand eine Idee?