OSDN Git Service

First commitment for the BlackTank LPC1769.
[blacktank/blacktank.git] / i2c_subsystem.c
1 /**
2  * \file i2c_subsystem.c
3  * \brief I2C制御関数群
4  * \date 2011/02/19
5  * \author Takemasa Nakamura
6  */
7 #include "i2c_subsystem.h"
8
9 #include <LPC17xx.h>
10 #include <kernel.h>
11 #include <t_syslog.h>
12
13 #define I2C_DEBUG 0
14
15 void i2c_init()
16 {
17     /* I2C0の電源をオン */
18     LPC_SC->PCONP |= 1 << 7;
19     /*  I2C0のPCLKを 1/4 にセット (25MHz) */
20     LPC_SC->PCLKSEL0 &= ~(0x3 << 14);
21
22     /* P0.27, P0.28を SCL0, SDA0に */
23     LPC_PINCON->PINSEL1 &= ~(0xF << 22);
24     LPC_PINCON->PINSEL1 |= 0x5 << 22;
25
26     /* I2C動作クロック 100KHz (コアクロック100MHzのとき) */
27     LPC_I2C0->I2SCLH = 1250;
28     LPC_I2C0->I2SCLL = 1250;
29
30     /* I2C ディセーブル */
31     LPC_I2C0->I2CONCLR = 0xFF;
32 }
33
34 void i2c_send_2bytes(int addr, int data0, int data1)
35 {
36     /* I2C マスターモード */
37     LPC_I2C0->I2CONSET = 0x40;
38     /* I2C START */
39     LPC_I2C0->I2CONSET = 0x20;
40     tslp_tsk(10);
41     if (LPC_I2C0->I2STAT != 0x08) {
42 #if I2C_DEBUG
43         syslog(LOG_NOTICE, "I2C0 Start. Expects 0x08 ");
44         syslog(LOG_NOTICE, "I2CONSET0 %02x", LPC_I2C0->I2CONSET);
45         syslog(LOG_NOTICE, "I2STAT0 %02x", LPC_I2C0->I2STAT);
46 #endif
47     }
48
49     /* I2C アドレス TLV320AIC23B CS=0, Write */
50     LPC_I2C0->I2DAT = addr << 1;
51
52     /* reset SIC & STA */
53     LPC_I2C0->I2CONCLR = 0x28;
54     tslp_tsk(10);
55     if (LPC_I2C0->I2STAT != 0x18) {
56 #if I2C_DEBUG
57         syslog(LOG_NOTICE, "SI&STA Clear, SLA + W sent. Expects 0x18 ");
58         syslog(LOG_NOTICE, "I2CONSET0 %02x", LPC_I2C0->I2CONSET);
59         syslog(LOG_NOTICE, "I2STAT0 %02x", LPC_I2C0->I2STAT);
60 #endif
61     }
62
63     /* 最初のデータの転送 */
64     LPC_I2C0->I2DAT = data0;
65     /* reset SIC */
66     LPC_I2C0->I2CONCLR = 0x08;
67     tslp_tsk(10);
68     if (LPC_I2C0->I2STAT != 0x28) {
69 #if I2C_DEBUG
70         syslog(LOG_NOTICE, "SI Clear, dataH sent. Expects 0x28 ");
71         syslog(LOG_NOTICE, "I2CONSET0 %02x", LPC_I2C0->I2CONSET);
72         syslog(LOG_NOTICE, "I2STAT0 %02x", LPC_I2C0->I2STAT);
73 #endif
74     }
75     /* 次のデータの転送 */
76     LPC_I2C0->I2DAT = data1;
77     /* reset SIC */
78     LPC_I2C0->I2CONCLR = 0x08;
79     tslp_tsk(10);
80     if (LPC_I2C0->I2STAT != 0x28) {
81 #if I2C_DEBUG
82         syslog(LOG_NOTICE, "SI Clear, dataL sent. Expects 0x28 ");
83         syslog(LOG_NOTICE, "I2CONSET0 %02x", LPC_I2C0->I2CONSET);
84         syslog(LOG_NOTICE, "I2STAT0 %02x", LPC_I2C0->I2STAT);
85 #endif
86     }
87     /* set STOP */
88     LPC_I2C0->I2CONSET = 0x10;
89
90     /* reset SIC */
91     LPC_I2C0->I2CONCLR = 0x08;
92     tslp_tsk(10);
93     if (LPC_I2C0->I2STAT != 0xF8) {
94 #if I2C_DEBUG
95         syslog(LOG_NOTICE, "SI Clear. Expects 0xF8, NO SI ");
96         syslog(LOG_NOTICE, "I2CONSET0 %02x", LPC_I2C0->I2CONSET);
97         syslog(LOG_NOTICE, "I2STAT0 %02x", LPC_I2C0->I2STAT);
98 #endif
99     }
100 }