I2C
I2C.c@0:b88f2b54dc27, 2017-10-14 (annotated)
- Committer:
- accelerator225
- Date:
- Sat Oct 14 13:57:22 2017 +0000
- Revision:
- 0:b88f2b54dc27
I2C
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
accelerator225 | 0:b88f2b54dc27 | 1 | #include "I2C.h" |
accelerator225 | 0:b88f2b54dc27 | 2 | #include"mbed.h" |
accelerator225 | 0:b88f2b54dc27 | 3 | |
accelerator225 | 0:b88f2b54dc27 | 4 | void Delay(u32 count){while (count--);} |
accelerator225 | 0:b88f2b54dc27 | 5 | void SDA_IN(){sda.input();} |
accelerator225 | 0:b88f2b54dc27 | 6 | void SDA_OUT(){sda.output();} |
accelerator225 | 0:b88f2b54dc27 | 7 | void IIC_SCL(int a = 0){scl.write(a);} |
accelerator225 | 0:b88f2b54dc27 | 8 | void IIC_SDA(int a = 0){sda.write(a);} |
accelerator225 | 0:b88f2b54dc27 | 9 | int READ_SDA(){return sda.read();} |
accelerator225 | 0:b88f2b54dc27 | 10 | void IIC_Init() |
accelerator225 | 0:b88f2b54dc27 | 11 | { |
accelerator225 | 0:b88f2b54dc27 | 12 | SDA.mode(OpenDrain); |
accelerator225 | 0:b88f2b54dc27 | 13 | SCL.mode(OpenDrain); |
accelerator225 | 0:b88f2b54dc27 | 14 | SDA_OUT(); |
accelerator225 | 0:b88f2b54dc27 | 15 | IIC_SDA(1); |
accelerator225 | 0:b88f2b54dc27 | 16 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 17 | } |
accelerator225 | 0:b88f2b54dc27 | 18 | void IIC_Start(void) |
accelerator225 | 0:b88f2b54dc27 | 19 | { |
accelerator225 | 0:b88f2b54dc27 | 20 | SDA_OUT(); //sdaÏßÊä³ö |
accelerator225 | 0:b88f2b54dc27 | 21 | IIC_SDA(); |
accelerator225 | 0:b88f2b54dc27 | 22 | IIC_SCL(); |
accelerator225 | 0:b88f2b54dc27 | 23 | |
accelerator225 | 0:b88f2b54dc27 | 24 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 25 | IIC_SDA(0);//START:when CLK is high,DATA change form high to low |
accelerator225 | 0:b88f2b54dc27 | 26 | |
accelerator225 | 0:b88f2b54dc27 | 27 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 28 | IIC_SCL(0);//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý |
accelerator225 | 0:b88f2b54dc27 | 29 | } |
accelerator225 | 0:b88f2b54dc27 | 30 | |
accelerator225 | 0:b88f2b54dc27 | 31 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 32 | *º¯ÊýÔÐÍ: void IIC_Stop(void) |
accelerator225 | 0:b88f2b54dc27 | 33 | *¹¦¡¡¡¡ÄÜ: //²úÉúIICÍ£Ö¹ÐźŠ|
accelerator225 | 0:b88f2b54dc27 | 34 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 35 | void IIC_Stop(void) |
accelerator225 | 0:b88f2b54dc27 | 36 | { |
accelerator225 | 0:b88f2b54dc27 | 37 | SDA_OUT();//sdaÏßÊä³ö |
accelerator225 | 0:b88f2b54dc27 | 38 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 39 | IIC_SDA(0);//STOP:when CLK is high DATA change form low to high |
accelerator225 | 0:b88f2b54dc27 | 40 | |
accelerator225 | 0:b88f2b54dc27 | 41 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 42 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 43 | IIC_SDA(1);//·¢ËÍI2C×ÜÏß½áÊøÐźŠ|
accelerator225 | 0:b88f2b54dc27 | 44 | |
accelerator225 | 0:b88f2b54dc27 | 45 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 46 | } |
accelerator225 | 0:b88f2b54dc27 | 47 | |
accelerator225 | 0:b88f2b54dc27 | 48 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 49 | *º¯ÊýÔÐÍ: unsigned char IIC_Wait_Ack(void) |
accelerator225 | 0:b88f2b54dc27 | 50 | *¹¦¡¡¡¡ÄÜ: µÈ´ýÓ¦´ðÐźŵ½À´ |
accelerator225 | 0:b88f2b54dc27 | 51 | //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü |
accelerator225 | 0:b88f2b54dc27 | 52 | // 0£¬½ÓÊÕÓ¦´ð³É¹¦ |
accelerator225 | 0:b88f2b54dc27 | 53 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 54 | unsigned char IIC_Wait_Ack(void) |
accelerator225 | 0:b88f2b54dc27 | 55 | { |
accelerator225 | 0:b88f2b54dc27 | 56 | unsigned char ucErrTime=0; |
accelerator225 | 0:b88f2b54dc27 | 57 | SDA_IN(); //SDAÉèÖÃΪÊäÈë |
accelerator225 | 0:b88f2b54dc27 | 58 | IIC_SDA(1); |
accelerator225 | 0:b88f2b54dc27 | 59 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 60 | while(READ_SDA) |
accelerator225 | 0:b88f2b54dc27 | 61 | { |
accelerator225 | 0:b88f2b54dc27 | 62 | ucErrTime++; |
accelerator225 | 0:b88f2b54dc27 | 63 | if(ucErrTime>50) |
accelerator225 | 0:b88f2b54dc27 | 64 | { |
accelerator225 | 0:b88f2b54dc27 | 65 | IIC_Stop(); |
accelerator225 | 0:b88f2b54dc27 | 66 | return 1; |
accelerator225 | 0:b88f2b54dc27 | 67 | } |
accelerator225 | 0:b88f2b54dc27 | 68 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 69 | } |
accelerator225 | 0:b88f2b54dc27 | 70 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 71 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 72 | IIC_SCL(0);//ʱÖÓÊä³ö0 |
accelerator225 | 0:b88f2b54dc27 | 73 | return 0; |
accelerator225 | 0:b88f2b54dc27 | 74 | } |
accelerator225 | 0:b88f2b54dc27 | 75 | |
accelerator225 | 0:b88f2b54dc27 | 76 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 77 | *º¯ÊýÔÐÍ: void IIC_Ack(void) |
accelerator225 | 0:b88f2b54dc27 | 78 | *¹¦¡¡¡¡ÄÜ: ²úÉúACKÓ¦´ð |
accelerator225 | 0:b88f2b54dc27 | 79 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 80 | void IIC_Ack(void) |
accelerator225 | 0:b88f2b54dc27 | 81 | { |
accelerator225 | 0:b88f2b54dc27 | 82 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 83 | SDA_OUT(); |
accelerator225 | 0:b88f2b54dc27 | 84 | IIC_SDA(0); |
accelerator225 | 0:b88f2b54dc27 | 85 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 86 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 87 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 88 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 89 | } |
accelerator225 | 0:b88f2b54dc27 | 90 | |
accelerator225 | 0:b88f2b54dc27 | 91 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 92 | *º¯ÊýÔÐÍ: void IIC_NAck(void) |
accelerator225 | 0:b88f2b54dc27 | 93 | *¹¦¡¡¡¡ÄÜ: ²úÉúNACKÓ¦´ð |
accelerator225 | 0:b88f2b54dc27 | 94 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 95 | void IIC_NAck(void) |
accelerator225 | 0:b88f2b54dc27 | 96 | { |
accelerator225 | 0:b88f2b54dc27 | 97 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 98 | SDA_OUT(); |
accelerator225 | 0:b88f2b54dc27 | 99 | IIC_SDA(0); |
accelerator225 | 0:b88f2b54dc27 | 100 | |
accelerator225 | 0:b88f2b54dc27 | 101 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 102 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 103 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 104 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 105 | } |
accelerator225 | 0:b88f2b54dc27 | 106 | |
accelerator225 | 0:b88f2b54dc27 | 107 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 108 | *º¯ÊýÔÐÍ: void IIC_Send_Byte(unsigned char txd) |
accelerator225 | 0:b88f2b54dc27 | 109 | *¹¦¡¡¡¡ÄÜ: IIC·¢ËÍÒ»¸ö×Ö½Ú |
accelerator225 | 0:b88f2b54dc27 | 110 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 111 | void IIC_Send_Byte(unsigned char txd) |
accelerator225 | 0:b88f2b54dc27 | 112 | { |
accelerator225 | 0:b88f2b54dc27 | 113 | unsigned char t; |
accelerator225 | 0:b88f2b54dc27 | 114 | SDA_OUT(); |
accelerator225 | 0:b88f2b54dc27 | 115 | IIC_SCL(0);//ÀµÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä |
accelerator225 | 0:b88f2b54dc27 | 116 | for(t=0;t<8;t++) |
accelerator225 | 0:b88f2b54dc27 | 117 | { |
accelerator225 | 0:b88f2b54dc27 | 118 | IIC_SDA=(txd&0x80)>>7; |
accelerator225 | 0:b88f2b54dc27 | 119 | txd<<=1; |
accelerator225 | 0:b88f2b54dc27 | 120 | |
accelerator225 | 0:b88f2b54dc27 | 121 | Delay(2); |
accelerator225 | 0:b88f2b54dc27 | 122 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 123 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 124 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 125 | Delay(3); |
accelerator225 | 0:b88f2b54dc27 | 126 | } |
accelerator225 | 0:b88f2b54dc27 | 127 | } |
accelerator225 | 0:b88f2b54dc27 | 128 | |
accelerator225 | 0:b88f2b54dc27 | 129 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 130 | *º¯ÊýÔÐÍ: unsigned char IIC_Read_Byte(unsigned char ack) |
accelerator225 | 0:b88f2b54dc27 | 131 | *¹¦¡¡¡¡ÄÜ: //¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK |
accelerator225 | 0:b88f2b54dc27 | 132 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 133 | unsigned char IIC_Read_Byte(unsigned char ack) |
accelerator225 | 0:b88f2b54dc27 | 134 | { |
accelerator225 | 0:b88f2b54dc27 | 135 | unsigned char i,receive=0; |
accelerator225 | 0:b88f2b54dc27 | 136 | SDA_IN();//SDAÉèÖÃΪÊäÈë |
accelerator225 | 0:b88f2b54dc27 | 137 | for(i=0;i<8;i++ ) |
accelerator225 | 0:b88f2b54dc27 | 138 | { |
accelerator225 | 0:b88f2b54dc27 | 139 | IIC_SCL(0); |
accelerator225 | 0:b88f2b54dc27 | 140 | |
accelerator225 | 0:b88f2b54dc27 | 141 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 142 | IIC_SCL(1); |
accelerator225 | 0:b88f2b54dc27 | 143 | receive<<=1; |
accelerator225 | 0:b88f2b54dc27 | 144 | if(READ_SDA)receive++; |
accelerator225 | 0:b88f2b54dc27 | 145 | |
accelerator225 | 0:b88f2b54dc27 | 146 | Delay(5); |
accelerator225 | 0:b88f2b54dc27 | 147 | } |
accelerator225 | 0:b88f2b54dc27 | 148 | if (ack) |
accelerator225 | 0:b88f2b54dc27 | 149 | IIC_Ack(); //·¢ËÍACK |
accelerator225 | 0:b88f2b54dc27 | 150 | else |
accelerator225 | 0:b88f2b54dc27 | 151 | IIC_NAck();//·¢ËÍnACK |
accelerator225 | 0:b88f2b54dc27 | 152 | return receive; |
accelerator225 | 0:b88f2b54dc27 | 153 | } |
accelerator225 | 0:b88f2b54dc27 | 154 | |
accelerator225 | 0:b88f2b54dc27 | 155 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 156 | *º¯ÊýÔÐÍ: unsigned char IICreadBytes(unsigned char dev, unsigned char reg, unsigned char length, unsigned char *data) |
accelerator225 | 0:b88f2b54dc27 | 157 | *¹¦¡¡¡¡ÄÜ: ¶ÁÈ¡Ö¸¶¨É豸 Ö¸¶¨¼Ä´æÆ÷µÄ length¸öÖµ |
accelerator225 | 0:b88f2b54dc27 | 158 | ÊäÈë dev Ä¿±êÉ豸µØÖ· |
accelerator225 | 0:b88f2b54dc27 | 159 | reg ¼Ä´æÆ÷µØÖ· |
accelerator225 | 0:b88f2b54dc27 | 160 | length Òª¶ÁµÄ×Ö½ÚÊý |
accelerator225 | 0:b88f2b54dc27 | 161 | *data ¶Á³öµÄÊý¾Ý½«Òª´æ·ÅµÄÖ¸Õë |
accelerator225 | 0:b88f2b54dc27 | 162 | ·µ»Ø ¶Á³öÀ´µÄ×Ö½ÚÊýÁ¿ |
accelerator225 | 0:b88f2b54dc27 | 163 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 164 | unsigned char IICreadBytes(unsigned char dev, unsigned char reg, unsigned char length, unsigned char *data){ |
accelerator225 | 0:b88f2b54dc27 | 165 | unsigned char count = 0; |
accelerator225 | 0:b88f2b54dc27 | 166 | |
accelerator225 | 0:b88f2b54dc27 | 167 | IIC_Start(); |
accelerator225 | 0:b88f2b54dc27 | 168 | IIC_Send_Byte(dev<<1); //·¢ËÍдÃüÁî |
accelerator225 | 0:b88f2b54dc27 | 169 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 170 | IIC_Send_Byte(reg); //·¢Ë͵ØÖ· |
accelerator225 | 0:b88f2b54dc27 | 171 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 172 | IIC_Start(); |
accelerator225 | 0:b88f2b54dc27 | 173 | IIC_Send_Byte((dev<<1)+1); //½øÈë½ÓÊÕģʽ |
accelerator225 | 0:b88f2b54dc27 | 174 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 175 | |
accelerator225 | 0:b88f2b54dc27 | 176 | for(count=0;count<length;count++){ |
accelerator225 | 0:b88f2b54dc27 | 177 | |
accelerator225 | 0:b88f2b54dc27 | 178 | if(count!=length-1)data[count]=IIC_Read_Byte(1); //´øACKµÄ¶ÁÊý¾Ý |
accelerator225 | 0:b88f2b54dc27 | 179 | else data[count]=IIC_Read_Byte(0); //×îºóÒ»¸ö×Ö½ÚNACK |
accelerator225 | 0:b88f2b54dc27 | 180 | } |
accelerator225 | 0:b88f2b54dc27 | 181 | IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ |
accelerator225 | 0:b88f2b54dc27 | 182 | return count; |
accelerator225 | 0:b88f2b54dc27 | 183 | } |
accelerator225 | 0:b88f2b54dc27 | 184 | |
accelerator225 | 0:b88f2b54dc27 | 185 | /**************************ʵÏÖº¯Êý******************************************** |
accelerator225 | 0:b88f2b54dc27 | 186 | *º¯ÊýÔÐÍ: unsigned char IICwriteBytes(unsigned char dev, unsigned char reg, unsigned char length, unsigned char* data) |
accelerator225 | 0:b88f2b54dc27 | 187 | *¹¦¡¡¡¡ÄÜ: ½«¶à¸ö×Ö½ÚдÈëÖ¸¶¨É豸 Ö¸¶¨¼Ä´æÆ÷ |
accelerator225 | 0:b88f2b54dc27 | 188 | ÊäÈë dev Ä¿±êÉ豸µØÖ· |
accelerator225 | 0:b88f2b54dc27 | 189 | reg ¼Ä´æÆ÷µØÖ· |
accelerator225 | 0:b88f2b54dc27 | 190 | length ҪдµÄ×Ö½ÚÊý |
accelerator225 | 0:b88f2b54dc27 | 191 | *data ½«ÒªÐ´µÄÊý¾ÝµÄÊ×µØÖ· |
accelerator225 | 0:b88f2b54dc27 | 192 | ·µ»Ø ·µ»ØÊÇ·ñ³É¹¦ |
accelerator225 | 0:b88f2b54dc27 | 193 | *******************************************************************************/ |
accelerator225 | 0:b88f2b54dc27 | 194 | unsigned char IICwriteBytes(unsigned char dev, unsigned char reg, unsigned char length, unsigned char* data){ |
accelerator225 | 0:b88f2b54dc27 | 195 | |
accelerator225 | 0:b88f2b54dc27 | 196 | unsigned char count = 0; |
accelerator225 | 0:b88f2b54dc27 | 197 | IIC_Start(); |
accelerator225 | 0:b88f2b54dc27 | 198 | IIC_Send_Byte(dev<<1); //·¢ËÍдÃüÁî |
accelerator225 | 0:b88f2b54dc27 | 199 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 200 | IIC_Send_Byte(reg); //·¢Ë͵ØÖ· |
accelerator225 | 0:b88f2b54dc27 | 201 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 202 | for(count=0;count<length;count++){ |
accelerator225 | 0:b88f2b54dc27 | 203 | IIC_Send_Byte(data[count]); |
accelerator225 | 0:b88f2b54dc27 | 204 | IIC_Wait_Ack(); |
accelerator225 | 0:b88f2b54dc27 | 205 | } |
accelerator225 | 0:b88f2b54dc27 | 206 | IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ |
accelerator225 | 0:b88f2b54dc27 | 207 | |
accelerator225 | 0:b88f2b54dc27 | 208 | return 1; //status == 0; |
accelerator225 | 0:b88f2b54dc27 | 209 | |
accelerator225 | 0:b88f2b54dc27 | 210 | } |