1 | // I2C Interface
|
2 | #define WM8731_I2C_MODULE I2C1
|
3 | #define WM8731_I2C_BAUDRATE 100000 // 100 kHz
|
4 | #define WM8731_I2C_ADDRESS 0x1A // -> 0x34 for Write
|
5 |
|
6 | void initWM8731()
|
7 | {
|
8 | // I2C pins as input
|
9 | TRISBbits.TRISB8 = 1;
|
10 | TRISBbits.TRISB9 = 1;
|
11 |
|
12 | // Setup I2C interface
|
13 | I2CConfigure(WM8731_I2C_MODULE, 0);
|
14 | I2CSetFrequency(WM8731_I2C_MODULE, GetPeripheralClock(), WM8731_I2C_BAUDRATE);
|
15 | }
|
16 |
|
17 | // This code is adapted from Microchip Audio Accessory Board
|
18 | static bool WM8731SendReg(WM8731_REGISTER reg, uint16_t cmd)
|
19 | {
|
20 | // register address is 7 bit, command is 9 bit
|
21 | reg <<= 1;
|
22 | reg |= ((cmd & 0x0100) >> 8);
|
23 | cmd &= 0xFF;
|
24 |
|
25 | I2CEnable(WM8731_I2C_MODULE, true);
|
26 | while(I2CBusIsIdle(WM8731_I2C_MODULE) == false);
|
27 |
|
28 | if(I2CStart(WM8731_I2C_MODULE) != I2C_SUCCESS)
|
29 | {
|
30 | I2CStop(WM8731_I2C_MODULE);
|
31 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
32 | I2CEnable(WM8731_I2C_MODULE, false);
|
33 | return false;
|
34 | }
|
35 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_START));
|
36 |
|
37 | if(I2CSendByte(WM8731_I2C_MODULE, (WM8731_I2C_ADDRESS << 1)) != I2C_SUCCESS)
|
38 | {
|
39 | I2CStop(WM8731_I2C_MODULE);
|
40 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
41 | I2CEnable(WM8731_I2C_MODULE, false);
|
42 | return false;
|
43 | }
|
44 | while(!I2CTransmissionHasCompleted(WM8731_I2C_MODULE));
|
45 |
|
46 | if(I2CByteWasAcknowledged(WM8731_I2C_MODULE) == false)
|
47 | {
|
48 | I2CStop(WM8731_I2C_MODULE);
|
49 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
50 | I2CEnable(WM8731_I2C_MODULE, false);
|
51 | return false;
|
52 | }
|
53 | while (!I2CBusIsIdle(WM8731_I2C_MODULE));
|
54 |
|
55 | //-----------------------------------------------------------------------
|
56 | // MAYBE HERE IS THE PROBLEM
|
57 | // because this byte isn't transmitted (see logic analyzer screenshot)
|
58 | //-----------------------------------------------------------------------
|
59 | if(I2CSendByte(WM8731_I2C_MODULE, reg) != I2C_SUCCESS)
|
60 | {
|
61 | I2CStop(WM8731_I2C_MODULE);
|
62 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
63 | I2CEnable(WM8731_I2C_MODULE, false);
|
64 | return false;
|
65 | }
|
66 | while(!I2CTransmissionHasCompleted(WM8731_I2C_MODULE));
|
67 |
|
68 | if(I2CByteWasAcknowledged(WM8731_I2C_MODULE) == false)
|
69 | {
|
70 | I2CStop(WM8731_I2C_MODULE);
|
71 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
72 | I2CEnable(WM8731_I2C_MODULE, false);
|
73 | return false;
|
74 | }
|
75 | while (!I2CBusIsIdle(WM8731_I2C_MODULE));
|
76 |
|
77 | if(I2CSendByte(WM8731_I2C_MODULE, cmd) != I2C_SUCCESS)
|
78 | {
|
79 | //-----------------------------------------------------------------------
|
80 | // HERE I GET THE "I2C_MASTER_BUS_COLLISION" ERROR
|
81 | //-----------------------------------------------------------------------
|
82 | I2CStop(WM8731_I2C_MODULE);
|
83 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
84 | I2CEnable(WM8731_I2C_MODULE, false);
|
85 | return false;
|
86 | }
|
87 |
|
88 | while(!I2CTransmissionHasCompleted(WM8731_I2C_MODULE));
|
89 |
|
90 | if(I2CByteWasAcknowledged(WM8731_I2C_MODULE) == false)
|
91 | {
|
92 | I2CStop(WM8731_I2C_MODULE);
|
93 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
94 | I2CEnable(WM8731_I2C_MODULE, false);
|
95 | return false;
|
96 | }
|
97 |
|
98 | while (!I2CBusIsIdle(WM8731_I2C_MODULE));
|
99 | I2CStop(WM8731_I2C_MODULE);
|
100 | while(!(I2CGetStatus(WM8731_I2C_MODULE) & I2C_STOP));
|
101 | I2CEnable(WM8731_I2C_MODULE, false);
|
102 | return true;
|
103 | }
|