#define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA
#define set_SDA GPIO_SetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
#define clr_SDA GPIO_ResetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
#define set_SCL GPIO_SetBits(GPIOA, GPIO_Pin_9) //PA9 SCL
#define clr_SCL GPIO_ResetBits(GPIOA, GPIO_Pin_9) //PA9 SCL

/*******************************************************************************
** IO¿ÚÅäÖÃ
*******************************************************************************/
void IO_Confing(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;//Òý½ÅÑ¡Ôñ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//Êä³öģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³öģʽ
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//´øÉÏÀ­µç×è
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//Êä³öËÙ¶È
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);

}
/*******************************************************************************
** SDA¿ÚÅäÖÃ
*******************************************************************************/
void SDA_MODE_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//Òý½ÅÑ¡Ôñ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//ÊäÈëģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ
}
void SDA_MODE_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//Òý½ÅÑ¡Ôñ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//Êä³öģʽ
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//²»´øÉÏÀ­µç×è
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//Êä³öËÙ¶È
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ
}

//*******************************************************************
// Æð¶¯×ÜÏߺ¯Êý
//º¯ÊýÔ­ÐÍ: void Start_I2c();
//¹¦ÄÜ: Æô¶¯I2C×ÜÏß,¼´·¢ËÍI2CÆðʼÌõ¼þ.
//*******************************************************************
void Start_I2c(void)
{
SDA_MODE_OUT();
clr_SDA; //·¢ËÍÆðʼÐźÅ
delay_us(2); //ÑÓʱ2us
clr_SCL; //ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
delay_us(2); //ÑÓʱ2us
}
//*******************************************************************
// ½áÊø×ÜÏߺ¯Êý
//º¯ÊýÔ­ÐÍ: void Stop_I2c();
//¹¦ÄÜ: ½áÊøI2C×ÜÏß,¼´·¢ËÍI2C½áÊøÌõ¼þ.
//*******************************************************************
void Stop_I2c(void)
{
SDA_MODE_OUT();
clr_SDA; //·¢ËÍÆðʼÐźÅ
delay_us(2); //ÑÓʱ2us
set_SCL;
delay_us(2); //ÑÓʱ2us
set_SDA; //·¢ËÍI2C×ÜÏß½áÊøÐźÅ
delay_us(5); //ÑÓʱ5us
}
//********************************************************************
// Ó¦´ð×Óº¯Êý
//º¯ÊýÔ­ÐÍ: void Ack_I2c(bit a);
//¹¦ÄÜ: Ö÷¿ØÆ÷½øÐÐÓ¦´ðÐźÅ(¿ÉÒÔÊÇÓ¦´ð»ò·ÇÓ¦´ðÐźţ¬ÓÉλ²ÎÊýa¾ö¶¨)
//********************************************************************
void Ack_I2c(u8 a) //Ó¦´ð»òÕß²»Ó¦´ð SDA=0Ó¦´ð£¬SDA=1·ÇÓ¦´ð
{
SDA_MODE_OUT();
clr_SCL; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ
delay_us(2); //ÑÓʱ2us
if(a==0)
clr_SDA; //ÔÚ´Ë·¢³öÓ¦´ð»ò·ÇÓ¦´ðÐźÅ
else
set_SDA;
delay_us(2); //ÑÓʱ2us
set_SCL;
delay_us(2); //ÑÓʱ2us
clr_SCL; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ
delay_us(2); //ÑÓʱ2us
clr_SDA; //·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźÅ
delay_us(2); //ÑÓʱ2us
}
//*******************************************************************
// ×Ö½ÚÊý¾Ý·¢Ëͺ¯Êý
//¹¦ÄÜ: ½«Êý¾Ýc·¢ËͳöÈ¥,¿ÉÒÔÊǵØÖ·,Ò²¿ÉÒÔÊÇÊý¾Ý,·¢ÍêºóµÈ´ýÓ¦´ð,²¢¶Ô
// ´Ë״̬λ½øÐвÙ×÷.(²»Ó¦´ð»ò·ÇÓ¦´ð¶¼Ê¹ack=0)
// ·¢ËÍÊý¾ÝÕý³££¬ack=1; ack=0±íʾ±»¿ØÆ÷ÎÞÓ¦´ð»òË𻵡£
//*******************************************************************
void SendByte(unsigned char dat)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //Òª´«Ë͵ÄÊý¾Ý³¤¶ÈΪ8λ
{
if((dat<<BitCnt)&0x80)
set_SDA; //ÅжϷ¢ËÍλ
else
clr_SDA;

delay_us(2); //ÑÓʱ2us
set_SCL; //ÖÃʱÖÓÏßΪ¸ß£¬Í¨Öª±»¿ØÆ÷¿ªÊ¼½ÓÊÕÊý¾Ýλ
delay_us(2); //ÑÓʱ3us
clr_SCL;
delay_us(2); //ÑÓʱ1us
}
SDA_MODE_IN();
set_SCL;
delay_us(2); //ÑÓʱ2us
if(read_SDA==1)
ack=0;
else
ack=1; //ÅжÏÊÇ·ñ½ÓÊÕµ½Ó¦´ðÐźÅ
clr_SCL;
delay_us(2); //ÑÓʱ2us
SDA_MODE_OUT();
delay_us(2); //ÑÓʱ2us
clr_SDA;
}

//*******************************************************************
// ×Ö½ÚÊý¾Ý½ÓÊÕº¯Êý
//º¯ÊýÔ­ÐÍ: UCHAR RcvByte();
//¹¦ÄÜ: ÓÃÀ´½ÓÊÕ´ÓÆ÷¼þ´«À´µÄÊý¾Ý,²¢ÅжÏ×ÜÏß´íÎó(²»·¢Ó¦´ðÐźÅ)£¬
// ·¢ÍêºóÇëÓÃÓ¦´ðº¯ÊýÓ¦´ð´Ó»ú¡£
//*******************************************************************
unsigned char RcvByte(void)
{
unsigned char retc=0;
unsigned char BitCnt;
SDA_MODE_IN();
delay_us(1);
for(BitCnt=0;BitCnt<8;BitCnt++)
{
clr_SCL; //ÖÃʱÖÓÏßΪµÍ£¬×¼±¸½ÓÊÕÊý¾Ýλ
delay_us(2); //ÑÓʱ5us
set_SCL; //ÖÃʱÖÓÏßΪ¸ßʹÊý¾ÝÏßÉÏÊý¾ÝÓÐЧ
delay_us(2); //ÑÓʱ2us
retc=retc<<1;
if(read_SDA==1)
retc=retc+1; //¶ÁÊý¾Ýλ,½ÓÊÕµÄÊý¾Ýλ·ÅÈëretcÖÐ
delay_us(2); //ÑÓʱ2us
}
clr_SCL;
delay_us(2); //ÑÓʱ2us
return(retc);
}
//*******************************************************************
// ÏòÓÐ×ÓµØÖ·Æ÷¼þ¶ÁÈ¡¶à×Ö½ÚÊý¾Ýº¯Êý
//º¯ÊýÔ­ÐÍ: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
//¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬×ÓµØÖ·,¶ÁÊý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þ
// µØÖ·sla£¬×ÓµØÖ·suba£¬¶Á³öµÄÄÚÈÝ·ÅÈësÖ¸ÏòµÄ´æ´¢Çø£¬¶Áno¸ö×Ö½Ú¡£
// Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£
//×¢Ò⣺ ʹÓÃǰ±ØÐëÒѽáÊø×ÜÏß¡£
//********************************************************************
u8 IRcvStr(unsigned char sla,unsigned char *s,unsigned char no)
{
unsigned char i;

Start_I2c(); //Æô¶¯×ÜÏß
SendByte(sla); //·¢ËÍÆ÷¼þµØÖ·
if(ack==0)//ÎÞÓ¦´ð
{
Stop_I2c();
return 0;
}
for(i=0;i<no-1;i++)
{
*s=RcvByte(); //
Ack_I2c(0); //½ÓÊվʹðλ
s++;
}
*s=RcvByte();
Ack_I2c(1); //·¢ËÍ·ÇӦλ
Stop_I2c(); //½áÊø×ÜÏß
return 1;
}

stm32f030 模拟IIC的更多相关文章

  1. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

  2. GPIO模拟IIC接口信号质量分析

    信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...

  3. lpc1788IO口模拟IIC

    #ifndef __MYIIC_H_ #define __MYIIC_H_ #include "common.h" #include "delay.h" #in ...

  4. STM32F10X -- 模拟IIC程序

    听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...

  5. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  6. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    #ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...

  7. GPIO软件模拟IIC时序

    一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...

  8. 模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)

    最终效果展示 OLED屏幕和GY30光照传感器(BH1750FVI)都连接在一个IIC(I2C)总线上,所以只需要接4根线即可.获取到的光照强度可以在OLED上实时显示并通过串口打印.IIC是IO模拟 ...

  9. C51—模拟IIC总线实现EEPROM存取数据

    a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...

  10. 用I/O口模拟IIC总线协议遇到的一些问题

    最近做的一个项目,是基于IIC总线通信的传感器系统.由于另外一个传感器使用的是类IIC协议,而不是标准IIC,所以MCU不能与其通信,最后没有办法,只有通过I/O口模拟的方式实现IIC的总线通信.具体 ...

随机推荐

  1. java中List的浅拷贝与深拷贝

    List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式进行存储. 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指 ...

  2. SAR成像(六):距离徙动矫正

    1.什么是距离徙动? 距离徙动产生原因是合成孔径雷达的运动平台与目标之间的相对运动.对于地面一静止的点目标,当它处于雷达波束照射范围内的时间中时,随着飞行载体的运动,它与雷达飞行载体之间的距离会不断的 ...

  3. Linux系统Shell脚本第一章:Shell脚本基础及时间同步

    目录 一.Shell脚本基础 1.Shell作用 2.什么是Shell脚本及处理逻辑 3.shell脚本基本格式 4. shell脚本执行方式 5.实操演示 二.Shell脚本中的变量 1.变量的作用 ...

  4. 使用yum快速安装mysql-5.7(用于测试)

    1)CentOS 7 下安装 MySQL 5.7 下载并安装MySQL官方的 Yum Repository [wget -i -c http://dev.mysql.com/get/mysql57-c ...

  5. postgresql数据库插入和读取图片

    postgresql插入和读取图片 postgresql存储图片需要二进制类型bytea,创建一张测试表: postgres=# create table test_image(img bytea); ...

  6. signalR从外部服务中推送消息和全局参数的设置

    在前面的章节中,我们都是采用两方模式, 客户端 <-> 服务端,也就是说在这种情况下如果有第三方如果有通知的没有办法插足的,下面解决方案 1:和之前的代码一样,在index页面加一个客户端 ...

  7. 24_webpack_打包分析

    一.打包时间的分析 如果我们希望看到每一个loader和plugin消耗的打包时间,可以借助于一个插件:speed-measure-webpakc-plugin 安装:npm i speed-meas ...

  8. 剑指 Offer 栈与队列

    09. 用两个栈实现队列 没啥意思 不要想复杂了 就是暴力 class CQueue { public: CQueue() { } /* 一个主栈 一个缓存栈 来回导 得到队头 copy后一端变空了 ...

  9. SCI、SSCI、EI、北大中文核心期刊、CSCD、CSSC、SCD、CSSCI 扩展版、计算机软件著作权

    https://zhidao.baidu.com/question/308484724.html SCI(科学引文索引).EI(工程索引).ISTP(科技会议录索引)是世界著名的三大科技文献检索系统, ...

  10. class_task

    #!/usr/bin/python # -*- coding: UTF-8 -*- class Task():     _cls_name = "cls name"     def ...