Ich habe hier ein PIC32MX mit einem MCP3422 ADC.
Frage 1: Muss ich bevor ich hier ADC Werte Auslesen kann erstmal das
Config register beschrieben werden? (Ich möchte die default Werte
nehmen)
Frage 2: Warum bleibt SDA low nachdem ich versucht habe Bytes zu lesen?
(ich bin mir ziemlich sicher das der MCP3422 diese auf low zieht)
1 | void ADC_Init(void) {
|
2 | UINT32 actualClock;
|
3 |
|
4 | actualClock = I2CSetFrequency(ADC_I2C_BUS, GetPeripheralClock(), ADC_I2C_CLOCK_FREQ);
|
5 | if ( abs(actualClock-ADC_I2C_CLOCK_FREQ) > ADC_I2C_CLOCK_FREQ/10 )
|
6 | {
|
7 | DBPRINTF("Error: I2C1 clock frequency (%u) error exceeds 10%%.\n", (unsigned)actualClock);
|
8 | }
|
9 |
|
10 | // Enable the I2C bus
|
11 | I2CEnable(ADC_I2C_BUS, TRUE);
|
12 |
|
13 | }
|
14 |
|
15 |
|
16 |
|
17 | void ADC_get_value(void) {
|
18 |
|
19 | UINT8 i2cData[10];
|
20 | I2C_7_BIT_ADDRESS SlaveAddress;
|
21 | BOOL Success = TRUE;
|
22 | UINT8 i2cbyte[5];
|
23 | BYTE ix;
|
24 |
|
25 | if( !StartTransfer(FALSE) )
|
26 | {
|
27 | while(1);
|
28 | }
|
29 |
|
30 | I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, 0x68, I2C_READ);
|
31 | i2cData[0] = SlaveAddress.byte;
|
32 | TransmitOneByte(i2cData[0]);
|
33 |
|
34 | if(!I2CByteWasAcknowledged(ADC_I2C_BUS))
|
35 | {
|
36 | DBPRINTF("Error: Sent byte was not acknowledged\n");
|
37 | Success = FALSE;
|
38 | }
|
39 |
|
40 | {
|
41 | if(I2CReceiverEnable(ADC_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW)
|
42 | {
|
43 | DBPRINTF("Error: I2C Receive Overflow\n");
|
44 | Success = FALSE;
|
45 | }
|
46 | else
|
47 | {
|
48 |
|
49 | for (ix=0; ix < 10; ix++) {
|
50 |
|
51 | while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS));
|
52 | I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
|
53 | i2cbyte[ix] = I2CGetByte(ADC_I2C_BUS);
|
54 | DelayMs(10);
|
55 | }
|
56 | DelayMs(10);
|
57 | }
|
58 | }
|
59 |
|
60 | StopTransfer();
|
So ganz verstehe ich auch nicht die Reihenfolge hier:
1 | // Warten bis ein Byte da ist? und wer schaltet dann die clock Leitung?
|
2 | // oder wird hier einfach mal auf glueck getaktet bis was kommt?
|
3 |
|
4 | while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS));
|
5 | I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
|
6 | i2cbyte[ix] = I2CGetByte(ADC_I2C_BUS);
|
7 | DelayMs(10);
|