OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7834|回复: 13

通用的IIC驱动

[复制链接]

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-10-15 10:08:29 | 显示全部楼层 |阅读模式
通用的IIC驱动。
很好配置,只需要修改宏定义即可。
用到了delay.c里的函数。当然你自己也可以重写与delay相关的延时函数(那样就不依赖delay.c了)。
自己写的代码,遵循GPL版权。

IIC.c

5.76 KB, 下载次数: 1171

IIC.h

2.68 KB, 下载次数: 788

原子哥是不是又要出黑科技了呀。^_^...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-10-15 10:23:30 | 显示全部楼层
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-10-15 10:33:25 | 显示全部楼层
顶顶顶顶顶顶顶顶,不错
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-15 12:30:17 | 显示全部楼层
不错,谢谢分享!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-15 14:04:54 | 显示全部楼层
谢谢分享,库函数版本
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2016-1-12
在线时间
41 小时
发表于 2016-3-29 08:28:02 | 显示全部楼层
感谢 谢谢分享
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-5-26
在线时间
10 小时
发表于 2016-8-2 19:56:57 | 显示全部楼层
帮顶,谢谢分享
回复 支持 反对

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2016-8-10 12:45:27 | 显示全部楼层
这个必须赞
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-4-10
在线时间
8 小时
发表于 2018-4-25 10:07:41 | 显示全部楼层
“莫名小镇”----一个电力方面资料的公众号,推荐
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2014-7-9
在线时间
25 小时
发表于 2018-9-19 16:58:57 | 显示全部楼层
谢谢 分享   
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-9-25
在线时间
2 小时
发表于 2018-9-25 15:24:13 | 显示全部楼层
是硬件的I2C吗?
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-9-25 15:42:20 | 显示全部楼层
[mw_shl_code=c,true]/**
  ******************************************************************************
  * @file      IIC.c
  * @brief     simulation function
  * @CPU       STM32F10x
  * @compiler  Keil uVision V4.74
  * @Author    Alex.fang(china shenzhen)
  * @Copyright GPL
  * @version   V1.0.0
  * @date      02-Sept-2015
  ******************************************************************************
  * @attention
  */  
     
#include "IIC.h"   
#include "delay.h"  

  
GPIO_InitTypeDef  GPIO_InitStructure;   
   
   
/**
  * @brief  IIC Init
  * @param  A:
  * @retval None
  */  
void IIC_Init(void)  
{                          
        RCC_APB2PeriphClockCmd(IIC_RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE);   
        GPIO_InitStructure.GPIO_Pin = IIC_SDA_GPIO_Pin | IIC_SCL_GPIO_Pin;  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);  
        GPIO_SetBits(IIC_GPIOx,IIC_SDA_GPIO_Pin | IIC_SCL_GPIO_Pin);  //PB10,PB11 输出高   
}  
  
/**
  * @brief  Set SDA Pin as Output Mode
  * @retval None
  */  
void SDA_OUT(void)   
{   
        GPIO_StructInit(&GPIO_InitStructure);   
        GPIO_InitStructure.GPIO_Pin   = IIC_SDA_GPIO_Pin;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);   
}   
  
/**
  * @brief  Set SDA Pin as Input Mode
  * @retval None
  */  
void SDA_IN(void)   
{   
        GPIO_StructInit(&GPIO_InitStructure);   
        GPIO_InitStructure.GPIO_Pin   = IIC_SDA_GPIO_Pin;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);   
}   
  
/**
  * @brief  read input voltage from SDA pin
  * @retval None
  */  
unsigned char SDA_READ(void)  
{  
        return GPIO_ReadInputDataBit(IIC_GPIOx, IIC_SDA_GPIO_Pin);  
}  
  
/**
  * @brief  output high form SDA pin
  * @retval None
  */  
void IIC_SDA_1(void)  
{  
        GPIO_SetBits(IIC_GPIOx, IIC_SDA_GPIO_Pin);  
}  
  
/**
  * @brief  output low form SDA pin
  * @retval None
  */  
void IIC_SDA_0(void)  
{  
        GPIO_ResetBits(IIC_GPIOx, IIC_SDA_GPIO_Pin);  
}  
  
/**
  * @brief  output high form SCL pin
  * @retval None
  */  
void IIC_SCL_1(void)  
{  
        GPIO_SetBits(IIC_GPIOx, IIC_SCL_GPIO_Pin);  
}  
  
/**
  * @brief  output LOW form SCL pin
  * @retval None
  */  
void IIC_SCL_0(void)  
{  
        GPIO_ResetBits(IIC_GPIOx, IIC_SCL_GPIO_Pin);   
}  
  
  
/**
* @brief  Simulate IIC conmunication :Create Start signal
  * @retval None
  */  
void IIC_Start(void)  
{  
    SDA_OUT();     //sda output   
    IIC_SDA_1();            
    IIC_SCL_1();  
    delay_us(4);  
    IIC_SDA_0();   //START:when CLK is high,DATA change form high to low   
    delay_us(4);  
    IIC_SCL_0();   //hold scl line, prepare to transmit data   
}      
  
/**
  * @brief  Simulate IIC conmunication : Create Stop signal
  * @retval None
  */  
void IIC_Stop(void)  
{  
    SDA_OUT();    //sda output mode   
    IIC_SCL_0();  
    IIC_SDA_0();  //STOP:when CLK is high DATA change form low to high   
    delay_us(4);  
    IIC_SCL_1();   
    IIC_SDA_1();  //indicate transmit over   
    delay_us(4);                              
}  
  
/**
* @brief  Simulate IIC conmunication : wait for target device's ACK
* @retval ACK (0) : receive success
* @retval NACK(1) : receive unsuccess
  */  
unsigned char IIC_Wait_Ack(void)  
{  
    unsigned char ucErrTime = 0;  
    SDA_IN();      //set as input mode   
    IIC_SDA_1();  
    delay_us(1);        
    IIC_SCL_1();  
    delay_us(1);      
    while(SDA_READ())  
    {  
        ucErrTime++;  
        if(ucErrTime > 250)  
        {  
            IIC_Stop();  
            return 1;  
        }  
    }  
    IIC_SCL_0(); //release scl line   
    return 0;   
}   
  
/**
  * @brief  Simulate IIC conmunication : make an ACK
  * @retval None
  */  
void IIC_Ack(void)  
{  
    IIC_SCL_0();  
    SDA_OUT();  
    IIC_SDA_0();  
    delay_us(2);  
    IIC_SCL_1();  
    delay_us(2);  
    IIC_SCL_0();  
}  
  
/**
  * @brief  Simulate IIC conmunication : don't make an ACK
  * @retval None
  */  
void IIC_NAck(void)  
{  
    IIC_SCL_0();  
    SDA_OUT();  
    IIC_SDA_1();  
    delay_us(2);  
    IIC_SCL_1();  
    delay_us(2);  
    IIC_SCL_0();  
}                                          
  
  
/**
  * @brief  Simulate IIC conmunication : Transmit one byte Data
  * @param  txd: data to be transmit
  * @retval None
  */  
void IIC_Send_Byte(unsigned char txd)  
{                          
        unsigned char i;     
        SDA_OUT();         
        IIC_SCL_0();//push down scl  to start transmit data   
        for(i = 0; i < 8; ++i)  
        {               
        if(txd & 0x80)  
        {  
                IIC_SDA_1();  
        }  
        else  
        {  
                IIC_SDA_0();  
        }  
        txd <<= 1;        
        delay_us(2);     
        IIC_SCL_1();  
        delay_us(2);   
        IIC_SCL_0();      
        delay_us(2);  
        }   
}      
  
/**
  * @brief  Simulate IIC conmunication : Receive one byte Data
  * @param  ack: Whether transmit ACK
  * @retval the data have been receive
  *  ack=1 send ACK
  *  ack=0 send nACK
  */   
unsigned char IIC_Read_Byte(unsigned char ack)  
{  
        unsigned char i, res = 0;  
        SDA_IN();               //SDA input mode   
        for(i = 0; i < 8; ++i ){  
                IIC_SCL_0();   
                delay_us(2);  
                IIC_SCL_1();  
                res <<= 1;  
                if(SDA_READ()){  
                        res++;   
                }        
                delay_us(1);   
        }                    
        if (!ack){  
                IIC_NAck();//make NACK   
        }  
        else {  
                IIC_Ack(); //make ACK   
        }  
        return res;  
}  



[/mw_shl_code]


[mw_shl_code=c,true]/**
  ******************************************************************************
  * @file      IIC.c
  * @brief     simulation function
  * @CPU       STM32F10x
  * @compiler  Keil uVision V4.74
  * @author    Alex.fang(china)
  * @copyright GPL
  * @version   V1.0.0
  * @date      02-Sept-2015
  ******************************************************************************
  * @attention
  */
#ifndef __IIC_H__
#define __IIC_H__
#include "stm32f10x.h"

#define IIC_SDA_GPIO_Pin           GPIO_Pin_11
#define IIC_SCL_GPIO_Pin           GPIO_Pin_10
#define IIC_GPIOx                  GPIOB
#define IIC_RCC_APB2Periph_GPIOx   RCC_APB2Periph_GPIOB
//#define IIC_SDA_GPIO_AF            GPIO_AF_1  //no use
//#define IIC_SCL_GPIO_AF            GPIO_AF_1  //no use

/**
  * @brief  IIC Init
  * @param  A:
  * @retval None
  */  
void IIC_Init(void);
  
/**
  * @brief  Set SDA Pin as Output Mode
  * @retval None
  */  
void SDA_OUT(void);   
  
/**
  * @brief  Set SDA Pin as Input Mode
  * @retval None
  */  
void SDA_IN(void);  
  
/**
  * @brief  read input voltage from SDA pin
  * @retval None
  */  
unsigned char SDA_READ(void);
  
/**
  * @brief  output high form SDA pin
  * @retval None
  */  
void IIC_SDA_1(void);
  
/**
  * @brief  output low form SDA pin
  * @retval None
  */  
void IIC_SDA_0(void);
/**
  * @brief  output high form SCL pin
  * @retval None
  */  
void IIC_SCL_1(void);
  
/**
  * @brief  output LOW form SCL pin
  * @retval None
  */  
void IIC_SCL_0(void);
  
/**
  * @brief  Simulate IIC conmunication :Create Start signal
  * @retval None
  */  
void IIC_Start(void);      
  
/**
  * @brief  Simulate IIC conmunication : Create Stop signal
  * @retval None
  */  
void IIC_Stop(void);
/**
* @brief  Simulate IIC conmunication : wait for target device's ACK
* @retval ACK (0) : receive success
* @retval NACK(1) : receive unsuccess
  */  
unsigned char IIC_Wait_Ack(void);  
  
/**
  * @brief  Simulate IIC conmunication : make an ACK
  * @retval None
  */  
void IIC_Ack(void);
/**
  * @brief  Simulate IIC conmunication : don't make an ACK
  * @retval None
  */  
void IIC_NAck(void);
/**
  * @brief  Simulate IIC conmunication : Transmit one byte Data
  * @param  txd: data to be transmit
  * @retval None
  */  
void IIC_Send_Byte(unsigned char txd);      
     
/**
  * @brief  Simulate IIC conmunication : Receive one byte Data
  * @param  ack: Whether transmit ACK
  * @retval the data have been receive
  *  ack=1 send ACK
  *  ack=0 send nACK
  */  
unsigned char IIC_Read_Byte(unsigned char ack);


#endif


[/mw_shl_code]
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-9-25 22:50:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-1-9
在线时间
1 小时
发表于 2020-2-26 10:14:00 | 显示全部楼层
谢谢,省了好多事,感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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