STM8S的硬件I2C还是存在问题,不敢贸然使用.

于是决定用模拟I2C.

#define SCL              PE_ODR_ODR1
#define SDA              PE_ODR_ODR2
#define SDAM             PE_IDR_IDR2
#define SET_SCL_OUT()    {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;}
#define SET_SDA_OUT()    {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;}
#define SET_SDA_IN()     {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;}
//--------------------------------------------------------------
// Prototype      : void I2C_Start(void)
// Calls          : Delay_5us()
// Description    : Start Singnal
//--------------------------------------------------------------
void I2C_Init(void)
{
   I2C_CR1 &= 0xFE;      //  PE=0, disable I2C module
   SET_SCL_OUT();
   SET_SDA_OUT();
}

//--------------------------------------------------------------
// Prototype      : void Delay_5us(void)
// Description    : 大约延时5us
//--------------------------------------------------------------
void Delay_5us(void)
{
   uchar i;                   //fcpu 8MHz 时
   ; i>; i--);
}

//--------------------------------------------------------------
// Prototype      : void I2C_Start(void)
// Calls          : Delay_5us()
// Description    : Start Singnal
//--------------------------------------------------------------
void I2C_Start(void)
{
    // SDA 1->0 while SCL High
    SDA = ;
    SCL = ;
    Delay_5us();
    SDA = ;
    Delay_5us();
    SCL = ;
}

//--------------------------------------------------------------
// Prototype      : void I2C_Stop(void)
// Calls          : Delay_5us()
// Description    : Stop Singnal
//--------------------------------------------------------------
void I2C_Stop(void)
{
    // SDA 0->1 while SCL High
    SDA = ;
    SCL = ;
    Delay_5us();
    SDA = ;
    Delay_5us();
}

//--------------------------------------------------------------
// Prototype      : void I2C_SendACK(uchar ack);
// Calls          : Delay_5us()
// Parameters     : bit ack:1-noack, 0-ack
// Description    : Master device send ACK to slave device.
//--------------------------------------------------------------
void I2C_SendACK(uchar ack)
{
    )
    {
      SDA = ;
    }
    else
    {
      SDA = ;
    }

    SCL = ;
    Delay_5us();  

    SCL = ;
    Delay_5us();
}

//--------------------------------------------------------------
// Prototype      : uchar I2C_SendByte(uchar sendDAT)
// Calls          : Delay_5us()
// Parameters     : uchar sendDAT---data to be send
// Return Value   : CY--slave ack (1---noack,0---ack)
// Description    : Send one byte to I2C
//--------------------------------------------------------------
uchar I2C_SendByte(uchar sendDAT)
{
    uchar i,revack;

     ; i< ; i++)
    {
     SCL = ;
     Delay_5us();  

 if (sendDAT & 0x80)             // write data
 {
       SDA = ;
 }
      else
 {
         SDA = ;
 }

        sendDAT <<=  ;

        SCL = ;
        Delay_5us();
    } 

   SCL = ;
   Delay_5us();  

   SET_SDA_IN();

   SCL = ;
   asm("nop");
   asm("nop");

   revack = (uchar)SDAM;

   Delay_5us();
   SCL = ;   

   SET_SDA_OUT();

   Delay_5us();  

   return revack;
}

//--------------------------------------------------------------
// Prototype      : uchar I2C_RecvByte()
// Calls          : Delay_5us()
// Parameters     : none
// Return Value   : revDAT- received data
// Description    : Receive one byte from I2C
//--------------------------------------------------------------
uchar I2C_RecvByte()
{
    uchar i;
    uchar revDAT = ;

    SDA = ;     // latch the Data port befor reading

    SET_SDA_IN();

    ; i<; i++)
    {
       revDAT <<= ;

       SCL = ; 

       asm("nop");
       asm("nop");

       if (SDAM)
       {
          revDAT |= 0x01;
       }
       else
       {
   revDAT &= 0xfe;
       }

       Delay_5us();
       SCL = ;
       Delay_5us();
    }

   SET_SDA_OUT();

   return revDAT;
}

//--------------------------------------------------------------
// Prototype      : void Write_PT2314(uchar wdata)
// Calls          : I2C_Start(), I2C_Stop(),I2C_SendByte()
// Parameters     : RegAddr-- target memory address,
//                  wrdata--- data to be writing
// Description    : Write one byte to target memory
//--------------------------------------------------------------
void Write_24c02(uchar regadd,uchar wdata)
{
    I2C_Start();
    I2C_SendByte(0xA0);     // Device Addr + Write (operation)
    I2C_SendByte(regadd);
    I2C_SendByte(wdata);
    I2C_Stop();
}

uchar Read_24c02(uchar regadd)
{
    uchar revdata;

    I2C_Start();
    I2C_SendByte(0xA0);     // Device Addr + Write (operation)
    I2C_SendByte(regadd); 

    I2C_Start();
    I2C_SendByte(0xA1);     // Device Addr + Write (operation)   

    revdata = I2C_RecvByte();
    I2C_SendACK();

    I2C_Stop();   

    return revdata;
}

STM8S 模拟I2C程序的更多相关文章

  1. gpio模拟i2c驱动

    前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...

  2. MSP430的IO口模拟I2C总线对AT24C25进行读写程序

    功能: 实现MSP430口线模拟I2C总线协议与24C04通信.                                           ** 描述: 主系统工作时钟为12MHz,I2C工 ...

  3. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  4. 模拟I2C从机

    模拟I2C主机的比较多,但是从机相对主机而言要难很多,这个供大家借鉴. 这个从机程序支持主机对它的随机写和随机读,连续读和连续写没做,有兴趣的可以完善下,呵呵. //Microcontrol CODE ...

  5. STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数

    1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...

  6. STM32F4XX中断方式通过IO模拟I2C总线Master模式

    STM32的I2C硬核为了规避NXP的知识产权,使得I2C用起来经常出问题,因此ST公司推出了CPAL库,CPAL库在中断方式工作下仅支持无子地址 的器件,无法做到中断方式完成读写大部分I2C器件.同 ...

  7. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

  8. C51单片机模拟I2C总线驱动程序设计

    /********************************** I2C总线驱动 ******************************** 模块名:I2C总线驱动 型号:I2C 功能描述 ...

  9. STM32F10x_模拟I2C读写_硬件I2C读写

    STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

随机推荐

  1. Latex笔记(参考文献) 分类: LaTex 2014-11-08 17:41 239人阅读 评论(0) 收藏

    当你用LaTeX来写文档,在管理参考文献时,你可能会用到bibtex, 也许你会嫌麻烦,会选择用 \begin{thebibliography}{10} \bibitem xxxx \bibitem ...

  2. 学习Oracle应该准备的技能

    首先数据库方面的技能:数据库体系结构.基本概念和基本理论.数据库管理.备份.恢复.SQL开发.PLSQL开发.工具的使用等等. 操作系统方面的技能:对Linux/Unix系统应该有相当的基础.理解RA ...

  3. 初步掌握Yarn的架构及原理

    1.YARN 是什么? 从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性, ...

  4. block代码块介绍

    关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...

  5. sqlserver时间字符串的截取

    昨天同学问了个sqlserver的问题,写了个简单的示例,如下: 问题:“15:00-16:30”拆分成“15:00-15:30”.“15:30-16:00”.“16:00-16:30”? 代码: d ...

  6. VMware Workstation 11序列号一枚

    VMware Workstation 11序列号: 1F04Z-6D111-7Z029-AV0Q4-3AEH8

  7. C#和asp.net中链接数据库中 参数的几种传递方法

    #region 参数传递方法第一种 //参数设置方法(第一种) //SqlParameter sp = new SqlParameter("@Name", str_Name); / ...

  8. 苹果开发 笔记(80)升级IOS 9 和 XCode 7 引起的问题记录

    原文: http://blog.csdn.net/hero82748274/article/details/48629461 问题一: 升级xcode 7最低的系统配置要求 升级了ios9 后使用 x ...

  9. JavaScript Boolean(布尔) 对象

    创建 Boolean 对象 Boolean 对象代表两个值:"true" 或者 "false" 下面的代码定义了一个名为 myBoolean 的布尔对象: va ...

  10. wordpress通过代码禁用IE8, IE9,IE10等IE浏览器兼容视图模式(Compatibility View)

    目前wordpress主流主题大多都放弃了对IE6的支持!甚至IE6,IE7,IE8等的兼容模式也不支持!目前特别是国内的双核浏览器大多数使用使用IE内核都是使用的兼容模式!那将是非常糟糕!如何让IE ...