- 1 //³õʼ»¯IIC
- 2 void IIC_Init(void) 3 {
- 4 GPIO_InitTypeDef GPIO_InitStructure;
- 5 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //ʹÄÜGPIOBʱÖÓ
- 6 7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- 8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
- 9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- 10 GPIO_Init(GPIOB, &GPIO_InitStructure);
- 11 GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7); //PB6,PB7 Êä³ö¸ß
- 12
- }
- 13 //²úÉúIICÆðʼÐźÅ
- 14 void IIC_Start(void) 15 {
- 16 SDA_OUT(); //sdaÏßÊä³ö
- 17 IIC_SDA = 1;
- 18 IIC_SCL = 1;
- 19 delay_us(4);
- 20 IIC_SDA = 0; //START:when CLK is high,DATA change form high to low
- 21 delay_us(4);
- 22 IIC_SCL = 0; //ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
- 23
- }
- 24 //²úÉúIICÍ£Ö¹ÐźÅ
- 25 void IIC_Stop(void) 26 {
- 27 SDA_OUT(); //sdaÏßÊä³ö
- 28 IIC_SCL = 0;
- 29 IIC_SDA = 0; //STOP:when CLK is high DATA change form low to high
- 30 delay_us(4);
- 31 IIC_SCL = 1;
- 32 IIC_SDA = 1; //·¢ËÍI2C×ÜÏß½áÊøÐźÅ
- 33 delay_us(4);
- 34
- }
- 35 //µÈ´ýÓ¦´ðÐźŵ½À´
- 36 //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
- 37 // 0£¬½ÓÊÕÓ¦´ð³É¹¦
- 38 u8 IIC_Wait_Ack(void) 39 {
- 40 u8 ucErrTime = 0;
- 41 SDA_IN(); //SDAÉèÖÃΪÊäÈë
- 42 IIC_SDA = 1;
- delay_us(1);
- 43 IIC_SCL = 1;
- delay_us(1);
- 44
- while (READ_SDA) 45 {
- 46 ucErrTime++;
- 47
- if (ucErrTime > 250) 48 {
- 49 IIC_Stop();
- 50
- return 1;
- 51
- }
- 52
- }
- 53 IIC_SCL = 0; //ʱÖÓÊä³ö0
- 54
- return 0;
- 55
- }
- 56 //²úÉúACKÓ¦´ð
- 57 void IIC_Ack(void) 58 {
- 59 IIC_SCL = 0;
- 60 SDA_OUT();
- 61 IIC_SDA = 0;
- 62 delay_us(2);
- 63 IIC_SCL = 1;
- 64 delay_us(2);
- 65 IIC_SCL = 0;
- 66
- }
- 67 //²»²úÉúACKÓ¦´ð
- 68 void IIC_NAck(void) 69 {
- 70 IIC_SCL = 0;
- 71 SDA_OUT();
- 72 IIC_SDA = 1;
- 73 delay_us(2);
- 74 IIC_SCL = 1;
- 75 delay_us(2);
- 76 IIC_SCL = 0;
- 77
- }
- 78 //IIC·¢ËÍÒ»¸ö×Ö½Ú
- 79 //·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
- 80 //1£¬ÓÐÓ¦´ð
- 81 //0£¬ÎÞÓ¦´ð
- 82 void IIC_Send_Byte(u8 txd) 83 {
- 84 u8 t;
- 85 SDA_OUT();
- 86 IIC_SCL = 0; //ÀµÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
- 87
- for (t = 0; t < 8; t++) 88 {
- 89 //IIC_SDA=(txd&0x80)>>7;
- 90
- if ((txd & 0x80) >> 7) 91 IIC_SDA = 1;
- 92
- else 93 IIC_SDA = 0;
- 94 txd <<= 1;
- 95 delay_us(2); //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
- 96 IIC_SCL = 1;
- 97 delay_us(2);
- 98 IIC_SCL = 0;
- 99 delay_us(2);
- 100
- }
- 101
- }
- 102 //¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK
- 103 u8 IIC_Read_Byte(unsigned char ack) 104 {
- 105 unsigned char i,
- receive = 0;
- 106 SDA_IN(); //SDAÉèÖÃΪÊäÈë
- 107
- for (i = 0; i < 8; i++) 108 {
- 109 IIC_SCL = 0;
- 110 delay_us(2);
- 111 IIC_SCL = 1;
- 112 receive <<= 1;
- 113
- if (READ_SDA) receive++;
- 114 delay_us(1);
- 115
- }
- 116
- if (!ack) 117 IIC_NAck(); //·¢ËÍnACK
- 118
- else 119 IIC_Ack(); //·¢ËÍACK
- 120
- return receive;
- 121
- }
来源: http://www.cnblogs.com/qflyue/p/6905465.html