社区导航

 

搜索
查看: 3668|回复: 23

[求助] 模拟IIC求助

[复制链接]

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-8-11 18:10 | 显示全部楼层 |阅读模式
本帖最后由 哈喽喽 于 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);   //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
  IIC_SCL_1;
  delay_us(2);
  IIC_SCL_0;  
  delay_us(2);
    }  
  //IIC_SDA_1;
  //delay_us(5);
}      
//¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK   
uint8_t IIC_Read_Byte(uint8_t ack)
{
unsigned char i,receive=0;
SDA_IN();//SDAÉèÖÃΪÊäÈë
  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();//·¢ËÍnACK
    else
        IIC_Ack(); //·¢ËÍACK   
  //IIC_SCL_0;
   return receive;
}
/******µ¥×Ö½ÚдÈë*******************************************/
void IIC_Single_Write(u8 SlaveAddress,u8 REG_Address,u8 REG_data)
{
    IIC_Start();                   //ÆðʼÐźÅ
    IIC_Send_Byte(SlaveAddress);    //·¢ËÍÉ豸µØÖ·+дÐźÅ
IIC_Wait_Ack();     //µÈ´ýÓ¦´ð
    IIC_Send_Byte(REG_Address);     //ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬ //Çë²Î¿¼ÖÐÎÄpdf22Ò³
IIC_Wait_Ack();     //µÈ´ýÓ¦´ð
    IIC_Send_Byte(REG_data);        //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬ //Çë²Î¿¼ÖÐÎÄpdf22Ò³
IIC_Wait_Ack();     //µÈ´ýÓ¦´ð
    IIC_Stop();                    //·¢ËÍÍ£Ö¹ÐźÅ
}
/********µ¥×Ö½Ú¶ÁÈ¡*****************************************/
u8 IIC_Single_Read(u8 SlaveAddress, u8 REG_Address)
{  
u8 REG_data;
    IIC_Start();                           //ÆðʼÐźÅ
    IIC_Send_Byte(SlaveAddress);            //·¢ËÍÉ豸µØÖ·+дÐźÅ
IIC_Wait_Ack();       //µÈ´ýÓ¦´ð
    IIC_Send_Byte(REG_Address);             //·¢ËÍ´æ´¢µ¥ÔªµØÖ·£¬//´Ó0¿ªÊ¼
IIC_Wait_Ack();       //µÈ´ýÓ¦´ð
    IIC_Start();                           //ÆðʼÐźÅ
    IIC_Send_Byte(SlaveAddress+1);          //·¢ËÍÉ豸µØÖ·+¶ÁÐźÅ
IIC_Wait_Ack();       //µÈ´ýÓ¦´ð
    REG_data = IIC_Read_Byte(0);            //¶Á³ö¼Ä´æÆ÷Êý¾Ý
IIC_Stop();                            //Í£Ö¹ÐźÅ
    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();
}



此帖出自stm32/stm8论坛

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-11 18:12 | 显示全部楼层
接受的数据在地址改变以后,数据还是不变,是不是通信有误?

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-11 18:12 | 显示全部楼层
不知道怎么回事,程序注释都是乱码

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-11 18:22 | 显示全部楼层
本帖最后由 哈喽喽 于 2015-8-11 20:40 编辑

#define IIC_SDA_0   GPIOB->BRR = GPIO_Pin_7;
#define IIC_SDA_1   GPIOB->BSRR = GPIO_Pin_7;   //sda=1
#define  IIC_SCL_0  GPIOB->BRR = GPIO_Pin_6;
#define  IIC_SCL_1  GPIOB->BSRR = GPIO_Pin_6;
#define SDA_IN()   GPIOB->MODER|=GPIO_Mode_IN<<7;  //sdaÊäÈë
#define SDA_OUT()   GPIOB->MODER|=GPIO_Mode_OUT<<7;//sda?
#define SCL_read   GPIOB->IDR  & GPIO_Pin_6
#define SDA_read   GPIOB->IDR  & GPIO_Pin_7
#define IIC_SDA   GPIOB->IDR
这是宏定义


回复

使用道具 举报

502

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-8-11 19:50 | 显示全部楼层
实验24 IIC实验.rar (493.86 KB, 下载次数: 17)

点评

谢谢,我下到的压缩包有问题!能不能发我邮箱,不甚感激!  详情 回复 发表于 2015-8-11 20:02

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-11 20:02 | 显示全部楼层
weizhongc 发表于 2015-8-11 19:50
你先用这个改过去吧,先用别人的,后面用多了,自然会懂得

谢谢,我下到的压缩包有问题!能不能发我邮箱913527593@qq.com,不甚感激!

点评

不好意思,我还是没弄出来  详情 回复 发表于 2015-8-12 10:28
发好了。如果还不行就把你整个源码发出来吧  详情 回复 发表于 2015-8-11 21:17

回复

使用道具 举报

502

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-8-11 21:17 | 显示全部楼层
哈喽喽 发表于 2015-8-11 20:02
谢谢,我下到的压缩包有问题!能不能发我邮箱,不甚感激!

发好了。如果还不行就把你整个源码发出来吧

点评

谢谢,我先看看  详情 回复 发表于 2015-8-11 21:18

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-11 21:18 | 显示全部楼层
weizhongc 发表于 2015-8-11 21:17
发好了。如果还不行就把你整个源码发出来吧

谢谢,我先看看

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-12 10:28 | 显示全部楼层
哈喽喽 发表于 2015-8-11 20:02
谢谢,我下到的压缩包有问题!能不能发我邮箱,不甚感激!

不好意思,我还是没弄出来

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-12 17:57 | 显示全部楼层
#define IIC_SDA_0   GPIOB->BRR = GPIO_Pin_7;
#define IIC_SDA_1   GPIOB->BSRR = GPIO_Pin_7;   //sda=1

#define  IIC_SCL_0  GPIOB->BRR = GPIO_Pin_6;
#define  IIC_SCL_1  GPIOB->BSRR =GPIO_Pin_6;
都是宏定义,但是SDA可以看到波形,但是SCL什么波形都没有,不知道怎么回事?

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-12 18:01 | 显示全部楼层
#define  IIC_SCL_0  GPIOB->BRR = GPIO_Pin_8;
#define  IIC_SCL_1  GPIOB->BSRR =GPIO_Pin_8;
将SCL定义为PB8以后,SCL也有了波形,不知道是PB6引脚坏了还是复用影响到了,但是我只是模拟IIC,应该和复用没有联系,而且我也没有使能复用时钟,问题还是没有解决。求帮助!

回复

使用道具 举报

3658

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2015-8-12 19:01 | 显示全部楼层
模拟I2C,主要就是把握好时序,两个引脚都有波形了。你就根据时序对比,看看哪里发生了错误。

点评

接传感器的一个引脚(SCL)没波形,但是程序改成其他的引脚则可以,还不知道原因  详情 回复 发表于 2015-8-12 19:59

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-12 19:59 | 显示全部楼层
ienglgge 发表于 2015-8-12 19:01
模拟I2C,主要就是把握好时序,两个引脚都有波形了。你就根据时序对比,看看哪里发生了错误。

接传感器的一个引脚(SCL)没波形,但是程序改成其他的引脚则可以,还不知道原因

点评

你吧整个程序上传上来吧  详情 回复 发表于 2015-8-13 12:27

回复

使用道具 举报

502

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-8-13 12:27 | 显示全部楼层
哈喽喽 发表于 2015-8-12 19:59
接传感器的一个引脚(SCL)没波形,但是程序改成其他的引脚则可以,还不知道原因

你吧整个程序上传上来吧

点评

我把最新的放在1楼了  详情 回复 发表于 2015-8-13 14:07

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-13 14:07 | 显示全部楼层
weizhongc 发表于 2015-8-13 12:27
你吧整个程序上传上来吧

我把最新的放在1楼了

点评

上传压缩包吧,看得眼都花了  详情 回复 发表于 2015-8-13 17:02

回复

使用道具 举报

502

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-8-13 17:02 | 显示全部楼层
哈喽喽 发表于 2015-8-13 14:07
我把最新的放在1楼了

上传压缩包吧,看得眼都花了

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-13 23:28 | 显示全部楼层
这是今晚弄成这样了,还是不行。感觉是void delay_ms(u16 nms)有点问题;
void delay_ms(u16 nms)
{         
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms
SysTick->VAL   =  (0x00);                  
SysTick->CTRL  |=0x00000001;     //0x00000001;
do
  {
  temp=SysTick->CTRL;
  }
while((temp&0x01)&&(!(temp&(1< SysTick->CTRL &=  (~(1<<0));    //¹Ø±Õ¼ÆÊýÆ÷
SysTick->VAL   =  (0x00); /* Load the SysTick Counter Value */   
}
这是不是用systick中断SysTick_Handler(void)有关,不知道里面添加什么

my_iic.rar

2.69 KB, 下载次数: 0

点评

这个是不用中断的延时。  详情 回复 发表于 2015-8-14 13:05

回复

使用道具 举报

1886

TA的帖子

0

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

荣誉会员勋章

发表于 2015-8-14 13:05 | 显示全部楼层
哈喽喽 发表于 2015-8-13 23:28
这是今晚弄成这样了,还是不行。感觉是void delay_ms(u16 nms)有点问题;
void delay_ms(u16 nms)
{      ...

这个是不用中断的延时。

点评

延时函数已经好了,我没有delay_init();,但是还是没通  详情 回复 发表于 2015-8-14 15:02

回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-14 15:02 | 显示全部楼层
Study_Stellaris 发表于 2015-8-14 13:05
这个是不用中断的延时。

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

回复

使用道具 举报

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2015-8-18 08:41 | 显示全部楼层
i2c本来就没很难,我调一个芯片调了好久都没调出来

点评

我的不知道卡哪了!  详情 回复 发表于 2015-8-18 11:04

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-5 20:51 , Processed in 0.569547 second(s), 42 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表