drv_iic.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. /******************************************************************//**
  2. * @file drv_iic.c
  3. * @brief Serial API of RT-Thread RTOS for EFM32
  4. * COPYRIGHT (C) 2011, RT-Thread Development Team
  5. * @author onelife
  6. * @version 0.4 beta
  7. **********************************************************************
  8. * @section License
  9. * The license and distribution terms for this file may be found in the file LICENSE in this
  10. * distribution or at http://www.rt-thread.org/license/LICENSE
  11. **********************************************************************
  12. * @section Change Logs
  13. * Date Author Notes
  14. * 2011-01-06 onelife Initial creation for EFM32
  15. *********************************************************************/
  16. /******************************************************************//**
  17. * @addtogroup efm32
  18. * @{
  19. *********************************************************************/
  20. /* Includes -------------------------------------------------------------------*/
  21. #include "board.h"
  22. #include "hdl_interrupt.h"
  23. #include "drv_iic.h"
  24. /* Private typedef -------------------------------------------------------------*/
  25. /* Private define --------------------------------------------------------------*/
  26. /* Private macro --------------------------------------------------------------*/
  27. /* Private variables ------------------------------------------------------------*/
  28. #ifdef RT_USING_IIC0
  29. #if (RT_USING_IIC0 > 3)
  30. #error "The location number range of IIC is 0~3"
  31. #endif
  32. struct rt_device iic0_device;
  33. static struct rt_device iic0_rx_index;
  34. #endif
  35. #ifdef RT_USING_IIC1
  36. #if (RT_USING_IIC1 > 3)
  37. #error "The location number range of IIC is 0~3"
  38. #endif
  39. struct rt_device iic1_device;
  40. static struct rt_device iic1_rx_index;
  41. #endif
  42. /* Private function prototypes ---------------------------------------------------*/
  43. /* Private functions ------------------------------------------------------------*/
  44. /******************************************************************//**
  45. * @brief
  46. * Initialize IIC device
  47. *
  48. * @details
  49. *
  50. * @note
  51. *
  52. * @param[in] dev
  53. * Pointer to device descriptor
  54. *
  55. * @return
  56. * Error code
  57. *********************************************************************/
  58. static rt_err_t rt_iic_init (rt_device_t dev)
  59. {
  60. struct efm32_iic_device_t* iic;
  61. iic = (struct efm32_iic_device_t*)dev->user_data;
  62. if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
  63. {
  64. /* Enable IIC */
  65. I2C_Enable(iic->iic_device, true);
  66. iic->rx_buffer = RT_NULL;
  67. iic->state = 0;
  68. dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
  69. }
  70. return RT_EOK;
  71. }
  72. /******************************************************************//**
  73. * @brief
  74. * Open IIC device
  75. *
  76. * @details
  77. *
  78. * @note
  79. *
  80. * @param[in] dev
  81. * Pointer to device descriptor
  82. *
  83. * @param[in] oflag
  84. * Device open flag
  85. *
  86. * @return
  87. * Error code
  88. *********************************************************************/
  89. static rt_err_t rt_iic_open(rt_device_t dev, rt_uint16_t oflag)
  90. {
  91. RT_ASSERT(dev != RT_NULL);
  92. #ifdef RT_IIC_DEBUG
  93. rt_kprintf("IIC: Open with flag %x\n", oflag);
  94. #endif
  95. return RT_EOK;
  96. }
  97. /******************************************************************//**
  98. * @brief
  99. * Close IIC device
  100. *
  101. * @details
  102. *
  103. * @note
  104. *
  105. * @param[in] dev
  106. * Pointer to device descriptor
  107. *
  108. * @return
  109. * Error code
  110. *********************************************************************/
  111. static rt_err_t rt_iic_close(rt_device_t dev)
  112. {
  113. struct efm32_iic_device_t *iic;
  114. iic = (struct efm32_iic_device_t *)(dev->user_data);
  115. rt_free(iic->rx_buffer->data_ptr);
  116. rt_free(iic->rx_buffer);
  117. iic->rx_buffer = RT_NULL;
  118. return RT_EOK;
  119. }
  120. /******************************************************************//**
  121. * @brief
  122. * Read from IIC device
  123. *
  124. * @details
  125. *
  126. * @note
  127. *
  128. * @param[in] dev
  129. * Pointer to device descriptor
  130. *
  131. * @param[in] pos
  132. * Offset
  133. *
  134. * @param[in] buffer
  135. * Poniter to the buffer
  136. *
  137. * @param[in] size
  138. * Buffer size in byte
  139. *
  140. * @return
  141. * Error code
  142. *********************************************************************/
  143. static rt_size_t rt_iic_read (
  144. rt_device_t dev,
  145. rt_off_t pos,
  146. void* buffer,
  147. rt_size_t size)
  148. {
  149. rt_err_t err_code;
  150. rt_size_t read_size;
  151. struct efm32_iic_device_t* iic;
  152. I2C_TransferSeq_TypeDef seq;
  153. I2C_TransferReturn_TypeDef ret;
  154. rt_uint8_t data[1];
  155. if (!size)
  156. {
  157. return 0;
  158. }
  159. err_code = RT_EOK;
  160. read_size = 0;
  161. iic = (struct efm32_iic_device_t*)dev->user_data;
  162. data[0] = (rt_uint8_t)(pos & 0x000000FF);
  163. if (iic->state & IIC_STATE_MASTER)
  164. {
  165. seq.addr = iic->slave_address;
  166. seq.flags = I2C_FLAG_WRITE_READ;
  167. /* Select register to be read */
  168. seq.buf[0].data = data;
  169. seq.buf[0].len = 1;
  170. /* Select location/length of data to be read */
  171. seq.buf[1].data = (rt_uint8_t *)buffer;
  172. seq.buf[1].len = size;
  173. /* Do a polled transfer */
  174. ret = I2C_TransferInit(iic->iic_device, &seq);
  175. while (ret == i2cTransferInProgress)
  176. {
  177. ret = I2C_Transfer(iic->iic_device);
  178. }
  179. if (ret != i2cTransferDone)
  180. {
  181. #ifdef RT_IIC_DEBUG
  182. rt_kprintf("IIC0 read error: %x\n", ret);
  183. rt_kprintf("IIC0 read address: %x\n", seq.addr);
  184. rt_kprintf("IIC0 read data0: %x -> %x\n", seq.buf[0].data, *seq.buf[0].data);
  185. rt_kprintf("IIC0 read len0: %x\n", seq.buf[0].len);
  186. rt_kprintf("IIC0 read data1: %x -> %x\n", seq.buf[1].data, *seq.buf[1].data);
  187. rt_kprintf("IIC0 read len1: %x\n", seq.buf[1].len);
  188. #endif
  189. err_code = (rt_err_t)ret;
  190. }
  191. else
  192. {
  193. read_size = size;
  194. #ifdef RT_IIC_DEBUG
  195. rt_kprintf("IIC0 read size: %d\n", read_size);
  196. #endif
  197. }
  198. }
  199. else
  200. {
  201. rt_uint8_t* ptr;
  202. ptr = buffer;
  203. /* interrupt mode Rx */
  204. while (size)
  205. {
  206. rt_base_t level;
  207. struct efm32_iic_int_mode_t *int_rx;
  208. int_rx = iic->rx_buffer;
  209. /* disable interrupt */
  210. level = rt_hw_interrupt_disable();
  211. if (int_rx->read_index != int_rx->save_index)
  212. {
  213. /* read a character */
  214. *ptr++ = int_rx->data_ptr[int_rx->read_index];
  215. size--;
  216. /* move to next position */
  217. int_rx->read_index ++;
  218. if (int_rx->read_index >= IIC_RX_BUFFER_SIZE)
  219. {
  220. int_rx->read_index = 0;
  221. }
  222. }
  223. else
  224. {
  225. /* set error code */
  226. err_code = -RT_EEMPTY;
  227. /* enable interrupt */
  228. rt_hw_interrupt_enable(level);
  229. break;
  230. }
  231. /* enable interrupt */
  232. rt_hw_interrupt_enable(level);
  233. }
  234. read_size = (rt_uint32_t)ptr - (rt_uint32_t)buffer;
  235. #ifdef RT_IIC_DEBUG
  236. rt_kprintf("IIC0 slave read size: %d\n", read_size);
  237. #endif
  238. }
  239. /* set error code */
  240. rt_set_errno(err_code);
  241. return read_size;
  242. }
  243. /******************************************************************//**
  244. * @brief
  245. * Write to IIC device
  246. *
  247. * @details
  248. *
  249. * @note
  250. *
  251. * @param[in] dev
  252. * Pointer to device descriptor
  253. *
  254. * @param[in] pos
  255. * Offset
  256. *
  257. * @param[in] buffer
  258. * Poniter to the buffer
  259. *
  260. * @param[in] size
  261. * Buffer size in byte
  262. *
  263. * @return
  264. * Error code
  265. *********************************************************************/
  266. static rt_size_t rt_iic_write (
  267. rt_device_t dev,
  268. rt_off_t pos,
  269. const void* buffer,
  270. rt_size_t size)
  271. {
  272. rt_err_t err_code;
  273. rt_size_t write_size;
  274. struct efm32_iic_device_t* iic;
  275. I2C_TransferSeq_TypeDef seq;
  276. I2C_TransferReturn_TypeDef ret;
  277. //rt_uint8_t data[1];
  278. if (!size)
  279. {
  280. return 0;
  281. }
  282. err_code = RT_EOK;
  283. write_size = 0;
  284. iic = (struct efm32_iic_device_t*)dev->user_data;
  285. //data[0] = (rt_uint8_t)(pos & 0x000000FF);
  286. if (iic->state & IIC_STATE_MASTER)
  287. {
  288. seq.addr = iic->slave_address;
  289. if (pos != (rt_off_t)(-1))
  290. {
  291. seq.flags = I2C_FLAG_WRITE_WRITE;
  292. /* Select register to be write */
  293. seq.buf[0].data = (rt_uint8_t *)(pos & 0x000000FF);
  294. seq.buf[0].len = 1;
  295. /* Select location/length of data to be write */
  296. seq.buf[1].data = (rt_uint8_t *)buffer;
  297. seq.buf[1].len = size;
  298. }
  299. else
  300. {
  301. seq.flags = I2C_FLAG_WRITE;
  302. /* Select location/length of data to be write */
  303. seq.buf[0].data = (rt_uint8_t *)buffer;
  304. seq.buf[0].len = size;
  305. }
  306. }
  307. else
  308. {
  309. // TODO: Slave mode TX
  310. }
  311. /* Do a polled transfer */
  312. ret = I2C_TransferInit(iic->iic_device, &seq);
  313. while (ret == i2cTransferInProgress)
  314. {
  315. ret = I2C_Transfer(iic->iic_device);
  316. }
  317. if (ret != i2cTransferDone)
  318. {
  319. err_code = (rt_err_t)ret;
  320. }
  321. else
  322. {
  323. write_size = size;
  324. }
  325. /* set error code */
  326. rt_set_errno(err_code);
  327. return write_size;
  328. }
  329. /******************************************************************//**
  330. * @brief
  331. * Configure IIC device
  332. *
  333. * @details
  334. *
  335. * @note
  336. *
  337. * @param[in] dev
  338. * Pointer to device descriptor
  339. *
  340. * @param[in] cmd
  341. * IIC control command
  342. *
  343. * @param[in] args
  344. * Arguments
  345. *
  346. * @return
  347. * Error code
  348. *********************************************************************/
  349. static rt_err_t rt_iic_control (
  350. rt_device_t dev,
  351. rt_uint8_t cmd,
  352. void *args)
  353. {
  354. RT_ASSERT(dev != RT_NULL);
  355. struct efm32_iic_device_t *iic;
  356. iic = (struct efm32_iic_device_t*)dev->user_data;
  357. switch (cmd)
  358. {
  359. case RT_DEVICE_CTRL_SUSPEND:
  360. /* suspend device */
  361. dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
  362. I2C_Enable(iic->iic_device, false);
  363. break;
  364. case RT_DEVICE_CTRL_RESUME:
  365. /* resume device */
  366. dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
  367. I2C_Enable(iic->iic_device, true);
  368. break;
  369. case RT_DEVICE_CTRL_IIC_SETTING:
  370. {
  371. /* change device setting */
  372. struct efm32_iic_control_t *control;
  373. control = (struct efm32_iic_control_t *)args;
  374. iic->state = control->config & (IIC_STATE_MASTER | IIC_STATE_BROADCAST);
  375. iic->master_address = control->master_address << 1;
  376. iic->slave_address = control->slave_address << 1;
  377. if (!(iic->state & IIC_STATE_MASTER))
  378. {
  379. if (iic->rx_buffer == RT_NULL)
  380. {
  381. iic->rx_buffer = rt_malloc(sizeof(struct efm32_iic_int_mode_t));
  382. if (iic->rx_buffer == RT_NULL)
  383. {
  384. #ifdef RT_IIC_DEBUG
  385. rt_kprintf("no memory for IIC RX structure\n");
  386. #endif
  387. return -RT_ENOMEM;
  388. }
  389. /* Allocate RX buffer */
  390. if ((iic->rx_buffer->data_ptr = \
  391. rt_malloc(IIC_RX_BUFFER_SIZE)) == RT_NULL)
  392. {
  393. #ifdef RT_IIC_DEBUG
  394. rt_kprintf("no memory for IIC RX buffer\n");
  395. #endif
  396. rt_free(iic->rx_buffer);
  397. return -RT_ENOMEM;
  398. }
  399. rt_memset(iic->rx_buffer->data_ptr, 0, IIC_RX_BUFFER_SIZE);
  400. iic->rx_buffer->data_size = IIC_RX_BUFFER_SIZE;
  401. iic->rx_buffer->read_index = 0;
  402. iic->rx_buffer->save_index = 0;
  403. }
  404. /* Enable slave mode */
  405. I2C_SlaveAddressSet(iic->iic_device, iic->slave_address);
  406. I2C_SlaveAddressMaskSet(iic->iic_device, 0xFF);
  407. iic->iic_device->CTRL |= I2C_CTRL_SLAVE | I2C_CTRL_AUTOACK | I2C_CTRL_AUTOSN;
  408. /* Enable interrupts */
  409. I2C_IntEnable(iic->iic_device, I2C_IEN_ADDR | I2C_IEN_RXDATAV | I2C_IEN_SSTOP);
  410. I2C_IntClear(iic->iic_device, _I2C_IFC_MASK);
  411. /* Enable I2Cn interrupt vector in NVIC */
  412. #ifdef RT_USING_IIC0
  413. if (dev == &iic0_device)
  414. {
  415. NVIC_ClearPendingIRQ(I2C0_IRQn);
  416. NVIC_SetPriority(I2C0_IRQn, EFM32_IRQ_PRI_DEFAULT);
  417. NVIC_EnableIRQ(I2C0_IRQn);
  418. }
  419. #endif
  420. #ifdef RT_USING_IIC1
  421. if (dev == &iic1_device)
  422. {
  423. NVIC_ClearPendingIRQ(I2C1_IRQn);
  424. NVIC_SetPriority(I2C1_IRQn, EFM32_IRQ_PRI_DEFAULT);
  425. NVIC_EnableIRQ(I2C1_IRQn);
  426. }
  427. #endif
  428. }
  429. }
  430. break;
  431. }
  432. return RT_EOK;
  433. }
  434. /******************************************************************//**
  435. * @brief
  436. * Register IIC device
  437. *
  438. * @details
  439. *
  440. * @note
  441. *
  442. * @param[in] device
  443. * Pointer to device descriptor
  444. *
  445. * @param[in] name
  446. * Device name
  447. *
  448. * @param[in] flag
  449. * Configuration flags
  450. *
  451. * @param[in] iic
  452. * Pointer to IIC device descriptor
  453. *
  454. * @return
  455. * Error code
  456. *********************************************************************/
  457. rt_err_t rt_hw_iic_register(
  458. rt_device_t device,
  459. const char *name,
  460. rt_uint32_t flag,
  461. struct efm32_iic_device_t *iic)
  462. {
  463. RT_ASSERT(device != RT_NULL);
  464. if ((flag & RT_DEVICE_FLAG_DMA_TX) || (flag & RT_DEVICE_FLAG_DMA_RX) ||
  465. (flag & RT_DEVICE_FLAG_INT_TX))
  466. {
  467. RT_ASSERT(0);
  468. }
  469. device->type = RT_Device_Class_Char;
  470. device->rx_indicate = RT_NULL;
  471. device->tx_complete = RT_NULL;
  472. device->init = rt_iic_init;
  473. device->open = rt_iic_open;
  474. device->close = rt_iic_close;
  475. device->read = rt_iic_read;
  476. device->write = rt_iic_write;
  477. device->control = rt_iic_control;
  478. device->user_data = iic;
  479. /* register a character device */
  480. return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
  481. }
  482. /******************************************************************//**
  483. * @brief
  484. * IIC slave mode RX data valid interrupt handler
  485. *
  486. * @details
  487. *
  488. * @note
  489. *
  490. * @param[in] dev
  491. * Pointer to device descriptor
  492. *********************************************************************/
  493. static void rt_hw_iic_slave_isr(rt_device_t dev)
  494. {
  495. struct efm32_iic_device_t *iic;
  496. struct efm32_iic_int_mode_t *int_rx;
  497. rt_uint32_t status;
  498. volatile rt_uint32_t temp;
  499. /* interrupt mode receive */
  500. RT_ASSERT(dev->flag & RT_DEVICE_FLAG_INT_RX);
  501. iic = (struct efm32_iic_device_t*)dev->user_data;
  502. int_rx = iic->rx_buffer;
  503. status = iic->iic_device->IF;
  504. if (status & I2C_IF_ADDR)
  505. {
  506. /* Address Match */
  507. /* Indicating that reception is started */
  508. temp = iic->iic_device->RXDATA & 0xFFUL;
  509. if ((temp != 0x00) || (iic->state & IIC_STATE_BROADCAST))
  510. {
  511. iic->state |= IIC_STATE_RX_BUSY;
  512. }
  513. }
  514. else if (status & I2C_IF_RXDATAV)
  515. {
  516. if (iic->state & IIC_STATE_RX_BUSY)
  517. {
  518. rt_base_t level;
  519. /* disable interrupt */
  520. level = rt_hw_interrupt_disable();
  521. /* save character */
  522. int_rx->data_ptr[int_rx->save_index] = \
  523. (rt_uint8_t)(iic->iic_device->RXDATA & 0xFFUL);
  524. int_rx->save_index ++;
  525. if (int_rx->save_index >= IIC_RX_BUFFER_SIZE)
  526. int_rx->save_index = 0;
  527. /* if the next position is read index, discard this 'read char' */
  528. if (int_rx->save_index == int_rx->read_index)
  529. {
  530. int_rx->read_index ++;
  531. if (int_rx->read_index >= IIC_RX_BUFFER_SIZE)
  532. {
  533. int_rx->read_index = 0;
  534. }
  535. }
  536. /* enable interrupt */
  537. rt_hw_interrupt_enable(level);
  538. }
  539. else
  540. {
  541. temp = iic->iic_device->RXDATA;
  542. }
  543. }
  544. if(status & I2C_IF_SSTOP)
  545. {
  546. /* Stop received, reception is ended */
  547. iic->state &= ~(rt_uint8_t)IIC_STATE_RX_BUSY;
  548. }
  549. }
  550. /******************************************************************//**
  551. * @brief
  552. * Initialize the specified IIC unit
  553. *
  554. * @details
  555. *
  556. * @note
  557. *
  558. * @param[in] unitNumber
  559. * Unit number
  560. *
  561. * @param[in] location
  562. * Pin location number
  563. *********************************************************************/
  564. static void rt_hw_iic_unit_init(
  565. rt_device_t device,
  566. rt_uint8_t unitNumber,
  567. rt_uint8_t location)
  568. {
  569. I2C_TypeDef *iic;
  570. CMU_Clock_TypeDef iicClock;
  571. I2C_Init_TypeDef init = I2C_INIT_DEFAULT;
  572. efm32_irq_hook_init_t hook;
  573. switch (unitNumber)
  574. {
  575. case 0:
  576. iic = I2C0;
  577. iicClock = (CMU_Clock_TypeDef)cmuClock_I2C0;
  578. hook.unit = 0;
  579. break;
  580. #if (I2C_COUNT > 1)
  581. case 1:
  582. iic = I2C1;
  583. iicClock = (CMU_Clock_TypeDef)cmuClock_I2C1;
  584. hook.unit = 1;
  585. break;
  586. #endif
  587. default:
  588. return;
  589. }
  590. /* Enabling clock */
  591. CMU_ClockEnable(iicClock, true);
  592. /* Reset */
  593. I2C_Reset(iic);
  594. /* Config GPIO */
  595. GPIO_PinModeSet(
  596. (GPIO_Port_TypeDef)AF_PORT(AF_I2C_SCL(unitNumber), location),
  597. AF_PIN(AF_I2C_SCL(unitNumber), location),
  598. gpioModeWiredAndPullUpFilter,
  599. 1);
  600. GPIO_PinModeSet(
  601. (GPIO_Port_TypeDef)AF_PORT(AF_I2C_SDA(unitNumber), location),
  602. AF_PIN(AF_I2C_SDA(unitNumber), location),
  603. gpioModeWiredAndPullUpFilter,
  604. 1);
  605. /* Enable SDZ and SCL pins and set location */
  606. iic->ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | \
  607. (location << _I2C_ROUTE_LOCATION_SHIFT);
  608. hook.type = efm32_irq_type_iic;
  609. hook.cbFunc = rt_hw_iic_slave_isr;
  610. hook.userPtr = device;
  611. efm32_irq_hook_register(&hook);
  612. /* Initializing IIC */
  613. init.enable = false;
  614. I2C_Init(iic, &init);
  615. /* Abort current TX data and clear TX buffers */
  616. iic->CMD = I2C_CMD_ABORT | I2C_CMD_CLEARPC | I2C_CMD_CLEARTX;
  617. }
  618. /******************************************************************//**
  619. * @brief
  620. * Initialize all IIC module related hardware and register IIC device to kernel
  621. *
  622. * @details
  623. *
  624. * @note
  625. *********************************************************************/
  626. void rt_hw_iic_init(void)
  627. {
  628. struct efm32_iic_device_t *iic;
  629. rt_uint32_t flag;
  630. flag = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX;
  631. /* register iic0 */
  632. #ifdef RT_USING_IIC0
  633. iic = rt_malloc(sizeof(struct efm32_iic_device_t));
  634. if (iic == RT_NULL)
  635. {
  636. #ifdef RT_IIC_DEBUG
  637. rt_kprintf("no memory for IIC0 driver\n");
  638. #endif
  639. return;
  640. }
  641. iic->iic_device = I2C0;
  642. iic->state |= IIC_STATE_MASTER;
  643. iic->master_address = 0x0000;
  644. iic->slave_address = 0x0000;
  645. iic->rx_buffer = RT_NULL;
  646. rt_hw_iic_unit_init(&iic0_device, 0, RT_USING_IIC0);
  647. rt_hw_iic_register(&iic0_device, RT_IIC0_NAME, flag, iic);
  648. #endif
  649. /* register iic1 */
  650. #ifdef RT_USING_IIC1
  651. iic = rt_malloc(sizeof(struct efm32_iic_device_t));
  652. if (iic == RT_NULL)
  653. {
  654. #ifdef RT_IIC_DEBUG
  655. rt_kprintf("no memory for IIC1 driver\n");
  656. #endif
  657. return;
  658. }
  659. iic->iic_device = I2C1;
  660. iic->state |= IIC_STATE_MASTER;
  661. iic->master_address = 0x0000;
  662. iic->slave_address = 0x0000;
  663. iic->rx_buffer = RT_NULL;
  664. rt_hw_iic_unit_init(&iic1_device, 1, RT_USING_IIC1);
  665. rt_hw_iic_register(&iic1_device, RT_IIC1_NAME, flag, iic);
  666. #endif
  667. }
  668. /******************************************************************//**
  669. * @}
  670. *********************************************************************/