5286|23

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

模拟IIC求助 [复制链接]

本帖最后由 哈喽喽 于 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论坛

最新回复

具体是什么芯片呢?一般厂家都会给出 Demo 程序,改改 IO 口配置就可以用了 。这种问题,不要卡太久,没什么意义。  详情 回复 发表于 2015-8-18 12:51
点赞 关注
 

回复
举报

39

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
接受的数据在地址改变以后,数据还是不变,是不是通信有误?
此帖出自stm32/stm8论坛
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
不知道怎么回事,程序注释都是乱码
此帖出自stm32/stm8论坛
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

4
 
本帖最后由 哈喽喽 于 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
这是宏定义

此帖出自stm32/stm8论坛
 
 
 

回复

466

帖子

0

TA的资源

版主

5
 
实验24 IIC实验.rar (493.86 KB, 下载次数: 17) 你先用这个改过去吧,先用别人的,后面用多了,自然会懂得
此帖出自stm32/stm8论坛

点评

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

回复

39

帖子

0

TA的资源

一粒金砂(中级)

6
 
weizhongc 发表于 2015-8-11 19:50
你先用这个改过去吧,先用别人的,后面用多了,自然会懂得

谢谢,我下到的压缩包有问题!能不能发我邮箱913527593@qq.com,不甚感激!
此帖出自stm32/stm8论坛

点评

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

回复

466

帖子

0

TA的资源

版主

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

发好了。如果还不行就把你整个源码发出来吧
此帖出自stm32/stm8论坛

点评

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

回复

39

帖子

0

TA的资源

一粒金砂(中级)

8
 
weizhongc 发表于 2015-8-11 21:17
发好了。如果还不行就把你整个源码发出来吧

谢谢,我先看看
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

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

不好意思,我还是没弄出来
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

10
 
#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什么波形都没有,不知道怎么回事?
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

11
 
#define  IIC_SCL_0  GPIOB->BRR = GPIO_Pin_8;
#define  IIC_SCL_1  GPIOB->BSRR =GPIO_Pin_8;
将SCL定义为PB8以后,SCL也有了波形,不知道是PB6引脚坏了还是复用影响到了,但是我只是模拟IIC,应该和复用没有联系,而且我也没有使能复用时钟,问题还是没有解决。求帮助!
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

12
 
模拟I2C,主要就是把握好时序,两个引脚都有波形了。你就根据时序对比,看看哪里发生了错误。
此帖出自stm32/stm8论坛

点评

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

回复

39

帖子

0

TA的资源

一粒金砂(中级)

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

接传感器的一个引脚(SCL)没波形,但是程序改成其他的引脚则可以,还不知道原因
此帖出自stm32/stm8论坛

点评

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

回复

466

帖子

0

TA的资源

版主

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

你吧整个程序上传上来吧
此帖出自stm32/stm8论坛

点评

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

回复

39

帖子

0

TA的资源

一粒金砂(中级)

15
 
weizhongc 发表于 2015-8-13 12:27
你吧整个程序上传上来吧

我把最新的放在1楼了
此帖出自stm32/stm8论坛

点评

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

回复

466

帖子

0

TA的资源

版主

16
 
哈喽喽 发表于 2015-8-13 14:07
我把最新的放在1楼了

上传压缩包吧,看得眼都花了
此帖出自stm32/stm8论坛
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

17
 
这是今晚弄成这样了,还是不行。感觉是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

此帖出自stm32/stm8论坛

点评

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

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

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

这个是不用中断的延时。
此帖出自stm32/stm8论坛

点评

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

回复

39

帖子

0

TA的资源

一粒金砂(中级)

19
 
Study_Stellaris 发表于 2015-8-14 13:05
这个是不用中断的延时。

延时函数已经好了,我没有delay_init();,但是还是没通
此帖出自stm32/stm8论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

20
 
i2c本来就没很难,我调一个芯片调了好久都没调出来
此帖出自stm32/stm8论坛

点评

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表