I2C

Committer:
accelerator225
Date:
Sat Oct 14 13:57:22 2017 +0000
Revision:
0:b88f2b54dc27
I2C

Who changed what in which revision?

UserRevisionLine numberNew 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 }