模拟IIC求助

2019-03-23 18:29发布

本帖最后由 哈喽喽 于 2015-8-13 14:06 编辑

以下是我的模拟IIC的程序,不知道哪有问题,收到的数据有误,好像没有进行通信,不知道该怎么改,求帮助!
/³õʼ»¯IIC
void IIC_Init(void)
{         
GPIO_InitTypeDef  GPIO_InitStructure;//GPIO??????
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_7;//SCL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//??????
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//????
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//??
GPIO_Init(GPIOB, &GPIO_InitStructure);//???GPIO

IIC_SDA_0;
IIC_SCL_1;         
}
void IIC_Start(void)
{
SDA_OUT();     //sdaÏßÊä³ö
IIC_SDA_1;
IIC_SCL_1;
delay_us(5);
  IIC_SDA_0;//START:when CLK is high,DATA change from high to low
delay_us(4);
IIC_SCL_0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
delay_us(2);
}   
//²úÉúIICÍ£Ö¹ÐźÅ
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßÊä³ö
IIC_SCL_0;
delay_us(1);
IIC_SDA_0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL_1;
delay_us(4);  
IIC_SDA_1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
delay_us(5);         
}
//µÈ´ýÓ¦´ðÐźŵ½À´
//·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
//        0£¬½ÓÊÕÓ¦´ð³É¹¦
uint8_t IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();      //SDAÉèÖÃΪÊäÈë  
IIC_SDA_1;
delay_us(1);   
IIC_SCL_1;
delay_us(1);  
while(SDA_read)//while(Read_SDA)
{
  ucErrTime++;
  if(ucErrTime>250)//250¸öʱÖÓÖÜÆÚ»¹Ã»ÊÕµ½Ó¦´ð£¬ÔòÈÏΪӦ´ðʧ°Ü£¬²¢½áÊø´Ë´ÎͨÐÅ
  {
   IIC_Stop;
   return 1;
  }
}
/*if(SDA_read)
{
  IIC_SCL_0;
  return 1;
} */
IIC_SCL_0;//ʱÖÓÊä³ö0     
return 0;  
}
//²úÉúACKÓ¦´ð
//Ö÷»úÔÚ½ÓÊÕµ½´Ó»úÊý¾Ýºó£¬Ïò´Ó»ú·µ»ØÒ»¸öÓ¦´ðÐźţ¬ÔÚSCLΪ¸ß£¬
//SDAһֱΪµÍÔò±íʾӦ´ð
void IIC_Ack(void)
{
IIC_SCL_0;
SDA_OUT();
IIC_SDA_0;
delay_us(2);
IIC_SCL_1;
delay_us(4);
IIC_SCL_0;
}
//²»²úÉúACKÓ¦´ð      
void IIC_NAck(void)
{
IIC_SCL_0;
SDA_OUT();
IIC_SDA_1;
delay_us(2);
IIC_SCL_1;
delay_us(4);
IIC_SCL_0;
}               
//IIC·¢ËÍÒ»¸ö×Ö½Ú
//·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
//1£¬ÓÐÓ¦´ð
//0£¬ÎÞÓ¦´ð     
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
   SDA_OUT();      
    IIC_SCL_0;//À µÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
for(t=0;t<8;t++)
    {              
      IIC_SDA=(txd&0x80)>>7;
   //if(txd&0x80) {IIC_SDA_1;}
   //else  IIC_SDA_0;
       txd<<=1;   
  delay_us(2);   //&para;&Ocirc;TEA5767&Otilde;&acirc;&Egrave;&yacute;&cedil;&ouml;&Ntilde;&Oacute;&Ecirc;±&para;&frac14;&Ecirc;&Ccedil;±&Oslash;&ETH;&euml;&micro;&Auml;
  IIC_SCL_1;
  delay_us(2);
  IIC_SCL_0;  
  delay_us(2);
    }  
  //IIC_SDA_1;
  //delay_us(5);
}      
//&para;&Aacute;1&cedil;&ouml;×&Ouml;&frac12;&Uacute;&pound;&not;ack=1&Ecirc;±&pound;&not;·&cent;&Euml;&Iacute;ACK&pound;&not;ack=0&pound;&not;·&cent;&Euml;&Iacute;nACK   
uint8_t IIC_Read_Byte(uint8_t ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA&Eacute;è&Ouml;&Atilde;&Icirc;&ordf;&Ecirc;&auml;&Egrave;&euml;
  for(i=0;i<8;i++ )
{
     IIC_SCL_0;
     delay_us(2);
   IIC_SCL_1;
     receive<<=1;
     if(SDA_read) receive++;
    //receive=(receive<<1)|SDA_read; //GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
  delay_us(5);
   }      
   if (!ack)
        IIC_NAck();//·&cent;&Euml;&Iacute;nACK
    else
        IIC_Ack(); //·&cent;&Euml;&Iacute;ACK   
  //IIC_SCL_0;
   return receive;
}
/******&micro;&yen;×&Ouml;&frac12;&Uacute;&ETH;&acute;&Egrave;&euml;*******************************************/
void IIC_Single_Write(u8 SlaveAddress,u8 REG_Address,u8 REG_data)
{
    IIC_Start();                   //&AElig;&eth;&Ecirc;&frac14;&ETH;&Aring;&ordm;&Aring;
    IIC_Send_Byte(SlaveAddress);    //·&cent;&Euml;&Iacute;&Eacute;è±&cedil;&micro;&Oslash;&Ouml;·+&ETH;&acute;&ETH;&Aring;&ordm;&Aring;
IIC_Wait_Ack();     //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    IIC_Send_Byte(REG_Address);     //&Auml;&Uacute;&sup2;&iquest;&frac14;&Auml;&acute;&aelig;&AElig;÷&micro;&Oslash;&Ouml;·&pound;&not; //&Ccedil;&euml;&sup2;&Icirc;&iquest;&frac14;&Ouml;&ETH;&Icirc;&Auml;pdf22&Ograve;&sup3;
IIC_Wait_Ack();     //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    IIC_Send_Byte(REG_data);        //&Auml;&Uacute;&sup2;&iquest;&frac14;&Auml;&acute;&aelig;&AElig;÷&Ecirc;&yacute;&frac34;&Yacute;&pound;&not; //&Ccedil;&euml;&sup2;&Icirc;&iquest;&frac14;&Ouml;&ETH;&Icirc;&Auml;pdf22&Ograve;&sup3;
IIC_Wait_Ack();     //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    IIC_Stop();                    //·&cent;&Euml;&Iacute;&Iacute;&pound;&Ouml;&sup1;&ETH;&Aring;&ordm;&Aring;
}
/********&micro;&yen;×&Ouml;&frac12;&Uacute;&para;&Aacute;&Egrave;&iexcl;*****************************************/
u8 IIC_Single_Read(u8 SlaveAddress, u8 REG_Address)
{  
u8 REG_data;
    IIC_Start();                           //&AElig;&eth;&Ecirc;&frac14;&ETH;&Aring;&ordm;&Aring;
    IIC_Send_Byte(SlaveAddress);            //·&cent;&Euml;&Iacute;&Eacute;è±&cedil;&micro;&Oslash;&Ouml;·+&ETH;&acute;&ETH;&Aring;&ordm;&Aring;
IIC_Wait_Ack();       //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    IIC_Send_Byte(REG_Address);             //·&cent;&Euml;&Iacute;&acute;&aelig;&acute;&cent;&micro;&yen;&Ocirc;&ordf;&micro;&Oslash;&Ouml;·&pound;&not;//&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;
IIC_Wait_Ack();       //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    IIC_Start();                           //&AElig;&eth;&Ecirc;&frac14;&ETH;&Aring;&ordm;&Aring;
    IIC_Send_Byte(SlaveAddress+1);          //·&cent;&Euml;&Iacute;&Eacute;è±&cedil;&micro;&Oslash;&Ouml;·+&para;&Aacute;&ETH;&Aring;&ordm;&Aring;
IIC_Wait_Ack();       //&micro;&Egrave;&acute;&yacute;&Oacute;&brvbar;&acute;&eth;
    REG_data = IIC_Read_Byte(0);            //&para;&Aacute;&sup3;&ouml;&frac14;&Auml;&acute;&aelig;&AElig;÷&Ecirc;&yacute;&frac34;&Yacute;
IIC_Stop();                            //&Iacute;&pound;&Ouml;&sup1;&ETH;&Aring;&ordm;&Aring;
    return REG_data;
}
//??1???     ??????  ?????    ?????    ????(M24C02)
void  IIC_ReadByte(uint8_t* pBuffer,uint8_t length,uint8_t ReadAddress,uint8_t DeviceAddress)
{  
   // uint8_t ack;
   //if(!I2C_Start())return FALSE;
    IIC_Send_Byte(DeviceAddress|0x0);
    if(!IIC_Wait_Ack())
    {
      IIC_Stop();
      //return FALSE;
    }
    IIC_Send_Byte(ReadAddress);   
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte(DeviceAddress|0x1);
    IIC_Wait_Ack();
  
/*
  IIC_Send_Byte(DeviceAddress+1);
  IIC_Wait_Ack();*/
    while(length--)
    {
      *pBuffer = IIC_Read_Byte(1);
      if(length == 1)
        IIC_NAck();
      else
        IIC_Ack();
      pBuffer++;
    }
    IIC_Stop();
}



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
weizhongc
1楼-- · 2019-03-25 13:45
 精彩回答 2  元偷偷看……
哈喽喽
2楼-- · 2019-03-25 18:10
weizhongc 发表于 2015-8-13 12:27
你吧整个程序上传上来吧

我把最新的放在1楼了
weizhongc
3楼-- · 2019-03-25 21:33
哈喽喽 发表于 2015-8-13 14:07
我把最新的放在1楼了

上传压缩包吧,看得眼都花了
哈喽喽
4楼-- · 2019-03-26 00:29
 精彩回答 2  元偷偷看……
Study_Stellaris
5楼-- · 2019-03-26 05:59
哈喽喽 发表于 2015-8-13 23:28
这是今晚弄成这样了,还是不行。感觉是void delay_ms(u16 nms)有点问题;
void delay_ms(u16 nms)
{      ...

这个是不用中断的延时。
哈喽喽
6楼-- · 2019-03-26 06:49
Study_Stellaris 发表于 2015-8-14 13:05
这个是不用中断的延时。

延时函数已经好了,我没有delay_init();,但是还是没通

一周热门 更多>