tinyusb  0.4
Click here to lend your support to tinyusb donation and make a donation at pledgie.com
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
uda1380.c
1 #include "../../board.h"
2 
3 #if BOARD == BOARD_EA4357
4 
5 #include "lpc43xx_i2c.h"
6 #include "lpc43xx_scu.h"
7 #include "uda1380.h"
8 
9 //Uda1380 link to I2C0 only
10 #define UDA1380_I2C LPC_I2C0
11 
12 
13 
14 /*********************************************************************/
20 int32_t Uda1380_Init(uint32_t i2cClockFreq, uint32_t i2sClockFreq)
21 {
22  int32_t ret;
23  uint8_t clk;
24 
25 // // Config Pin for I2C_SDA and I2C_SCL of I2C0
26 // scu_pinmux( 2 , 3 , MD_PLN_FAST, FUNC1 );
27 // scu_pinmux( 2 , 4 , MD_PLN_FAST, FUNC1 );
28 
29  I2C_Init(UDA1380_I2C, i2cClockFreq);
30 
31  /* Enable I2C1 operation */
32  I2C_Cmd(UDA1380_I2C, ENABLE);
33 
34  /* Reset */
35  ret = Uda1380_WriteData(UDA1380_REG_L3, 0 );
36  if(ret != UDA1380_FUNC_OK)
37  return ret;
38 
39  /* Write clock settings */
40  ret = Uda1380_WriteData(UDA1380_REG_I2S,0 );
41  if(ret != UDA1380_FUNC_OK)
42  return ret;
43 
44  ret = Uda1380_WriteData(UDA1380_REG_MSTRMUTE,0);
45  if(ret != UDA1380_FUNC_OK)
46  return ret;
47 
48  ret = Uda1380_WriteData(UDA1380_REG_MIXSDO,0);
49  if(ret != UDA1380_FUNC_OK)
50  return ret;
51 
52 #if UDA1380_SYSCLK_USED //Use SYSCLK
53  ret = Uda1380_WriteData(UDA1380_REG_EVALCLK,
54  EVALCLK_DEC_EN | EVALCLK_DAC_EN | EVALCLK_INT_EN | EVALCLK_DAC_SEL_SYSCLK );
55  if(ret != UDA1380_FUNC_OK)
56  return ret;
57 
58  ret = Uda1380_WriteData(UDA1380_REG_PWRCTRL,
59  PWR_PON_HP_EN | PWR_PON_DAC_EN | PWR_PON_BIAS_EN);
60  if(ret != UDA1380_FUNC_OK)
61  return ret;
62 
63 #else //Use WSPLL
64  if(i2sClockFreq >= 6250 && i2sClockFreq < 12500)
65  clk = EVALCLK_WSPLL_SEL6_12K;
66  else if(i2sClockFreq >= 12501 && i2sClockFreq < 25000)
67  clk = EVALCLK_WSPLL_SEL12_25K;
68  else if(i2sClockFreq >= 25001 && i2sClockFreq < 50000)
69  clk = EVALCLK_WSPLL_SEL25_50K;
70  else if(i2sClockFreq >= 50001 && i2sClockFreq < 100000)
71  clk = EVALCLK_WSPLL_SEL50_100K;
72  else
73  clk= 0;
74 
75  ret = Uda1380_WriteData(UDA1380_REG_EVALCLK,
76  EVALCLK_DEC_EN | EVALCLK_DAC_EN | EVALCLK_INT_EN | EVALCLK_DAC_SEL_WSPLL | clk);
77  if(ret != UDA1380_FUNC_OK)
78  return ret;
79 
80  ret = Uda1380_WriteData(UDA1380_REG_PWRCTRL,
81  PWR_PON_PLL_EN | PWR_PON_HP_EN | PWR_PON_DAC_EN | PWR_PON_BIAS_EN);
82  if(ret != UDA1380_FUNC_OK)
83  return ret;
84 #endif
85  return UDA1380_FUNC_OK;
86 }
87 
88 /*********************************************************************/
94 int32_t Uda1380_WriteData(uint8_t reg, uint16_t data)
95 {
96  I2C_M_SETUP_Type i2cData;
97  uint8_t i2cBuf[UDA1380_CMD_BUFF_SIZE];
98 
99  i2cBuf[0] = reg;
100  i2cBuf[1] = (data >> 8) & 0xFF;
101  i2cBuf[2] = data & 0xFF;
102 
103  i2cData.sl_addr7bit = UDA1380_SLAVE_ADDR;
104  i2cData.tx_length = UDA1380_CMD_BUFF_SIZE;
105  i2cData.tx_data = i2cBuf;
106  i2cData.rx_data = NULL;
107  i2cData.rx_length = 0;
108  i2cData.retransmissions_max = 3;
109 
110  if (I2C_MasterTransferData(UDA1380_I2C, &i2cData, I2C_TRANSFER_POLLING) == SUCCESS)
111  {
112  uint16_t dataTmp;
113  if(Uda1380_ReadData(reg, &dataTmp) != UDA1380_FUNC_OK) {
114  return UDA1380_FUNC_ERR;
115  }
116  if(dataTmp != data)
117  return UDA1380_FUNC_ERR;
118 
119  return UDA1380_FUNC_OK;
120  }
121 
122  return UDA1380_FUNC_ERR;
123 }
124 
125 
126 /*********************************************************************/
132 int32_t Uda1380_ReadData(uint8_t reg, uint16_t *data)
133 {
134  I2C_M_SETUP_Type i2cData;
135  uint8_t i2cBuf[UDA1380_CMD_BUFF_SIZE];
136 
137  if(data == NULL)
138  return UDA1380_FUNC_ERR;
139 
140  i2cBuf[0] = reg;
141 
142  i2cData.sl_addr7bit = UDA1380_SLAVE_ADDR;
143  i2cData.tx_length = 1;
144  i2cData.tx_data = i2cBuf;
145  i2cData.rx_data = &i2cBuf[1];
146  i2cData.rx_length = UDA1380_CMD_BUFF_SIZE - 1;
147  i2cData.retransmissions_max = 3;
148 
149  if (I2C_MasterTransferData(UDA1380_I2C, &i2cData, I2C_TRANSFER_POLLING) == SUCCESS)
150  {
151  *data = i2cBuf[1] << 8 | i2cBuf[2];
152  return UDA1380_FUNC_OK;
153  }
154 
155  return UDA1380_FUNC_ERR;
156 }
157 
158 #endif
159