首页 DSP技术 嵌入式开发 电源技术 单片机学习 IC设计 工业自动化 无线通讯技术 嵌入式实时操作系统
驱动开发 CAN总线 EDA技术 PCB设计 8051单片机 MSP单片机 PIC单片机
AVR单片机 ARM学习 LED论坛 FPGA论坛 周立功单片机 mp3开发 Flash闪存 手机方案

首页->AVR单片机->正文

I2C读写pcf8563和ove7620的gcc例子

上篇: 菜鸟提问:麻烦大家看看我的编程器到底是什么问题?先谢了!
下篇: 谈AVR的抗干扰问题。

 

问题: 共享一下。改自ZLG的i2c程序 :)

i2c.h
====================
#include <AVR/io.h>

#include "type.h"

#define SDA PB1
#define SCL PB0
#define    I2C_PORT DDRB

#define    SCL_1    cbi(I2C_PORT, SCL);
#define    SCL_0    sbi(I2C_PORT, SCL);
#define    SDA_1    cbi(I2C_PORT, SDA);
#define    SDA_0    sbi(I2C_PORT, SDA);  


uchar ack;             /*应答标志位*/
uchar UartRecFlag;
uchar RecData;

void Start_I2c();
void Stop_I2c();
void SendByte(uchar c);
uchar RcvByte();
void Ack_I2c(uchar a);
void ReadIC(uchar icadder, uchar adder, uchar count, uchar *buff);
void SetIC(uchar icadder, uchar adder, uchar value);

i2c.c
================================
#include "i2c.h"

void  _Nop(uchar dly)       /*定义空指令*/
{
    uchar i;
    for(i=0;i<dly;i++);
}

void Start_I2c()
{
  SDA_1;   /*发送起始条件的数据信号*/
  _Nop(1);
  SCL_1;
  _Nop(5);    /*起始条件建立时间大于4.7us,延时*/   
  SDA_0;   /*发送起始信号*/
  _Nop(5);    /* 起始条件锁定时间大于4μs*/
       
  SCL_0;   /*钳住I2C总线,准备发送或接收数据 */
  _Nop(2);
}

void Stop_I2c()
{
  SDA_0  /*发送结束条件的数据信号*/
  _Nop(1);   /*发送结束条件的时钟信号*/
  SCL_1  /*结束条件建立时间大于4μs*/
  _Nop(5);
  SDA_1  /*发送I2C总线结束信号*/
  _Nop(4);
}


void  SendByte(uchar c)
{
uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)
         SDA_1          /*判断发送位*/
      else  
       SDA_0                
     _Nop(1);
     SCL_1                   /*置时钟线为高,通知被控器开始接收数据位*/
      _Nop(5);        
     SCL_0
    }
    
    _Nop(2);
    SDA_1               /*8位发送完后释放数据线,准备接收应答位*/
    _Nop(2);
    SCL_1
    _Nop(3);
    if(bit_is_set(PINB,SDA))ack=0;     
       else ack=1;        /*判断是否接收到应答信号*/
    SCL_0
    _Nop(2);
}

uchar  RcvByte()
{
  uchar retc;
  uchar BitCnt;
  
  retc=0;
  SDA_1             /*置数据线为输入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop(1);           
        SCL_0       /*置时钟线为低,准备接收数据位*/
        _Nop(4);
        SCL_1       /*置时钟线为高使数据线上数据有效*/
        _Nop(2);
        retc=retc<<1;
        if(bit_is_set(PINB,SDA))retc=retc+1; /*读数据位,接收的数据位放入retc中 */
        _Nop(2);
      }
  SCL_0    
  _Nop(2);
  return(retc);
}

void Ack_I2c(uchar a)
{
  
  if(a==0)SDA_0     /*在此发出应答或非应答信号 */
        else SDA_1
  _Nop(3);  
  SCL_1
    _Nop(5);
SCL_0               /*清时钟线,钳住I2C总线以便继续接收*/
    _Nop(2);
}


void ReadIC(uchar icadder, uchar adder, uchar count, uchar *buff)
{    
    uchar i;
    Start_I2c();
    SendByte(icadder);
    _Nop(10);
     SendByte(adder);
     _Nop(10);
    
    Stop_I2c();

     Start_I2c();
     SendByte(icadder+1);
     _Nop(10);

     for (i=0;i<count;i++)
     {
         buff[i]=RcvByte();
         if (i!=count-1) Ack_I2c(0);//除最后一个字节外,其他都要从MASTER发应答。
     }
     //SendAck();//除最后一个字节外,其他都要从MASTER发应答。

     Ack_I2c(1);
     Stop_I2c();
    
}

void SetIC(uchar icadder, uchar adder, uchar value)
{
    Start_I2c();
    SendByte(icadder);  //写入IC命令
    _Nop(1);
    SendByte(adder);     //写入地址
    _Nop(1);
    SendByte(value);    //写入值
    _Nop(1);
    
    Stop_I2c();    
}
回答1:好东西啊!
回答2:好东西啊!好东西啊!好东西啊!好东西啊!
回答3:好象uchar还没有定义!
回答4:你自己typedef 或者#define 一下不行啊!

相关资料:

 ICP是不是涨价了? 程序还没有进入到main,就跳到数据中止了!
 7290的用法 今天看资料发现LPC2210的一个设计问题,高手进来说明
 PCF8576的功耗能不能降到20UA zlg7290里面的所有寄存器都是可读可写的吗?
 请问内部的EEPROM 求助:使用AT45DB081遇到的问题.
 写STC单片机FLASH的最好办法 STC MCU 商业版与工业版主要有哪些区别?
 STC和89S52对比实验 STC你哪有3.8元的单片机啊
 无线(非接触式)ISP就好了 想搞自己的isp
 求助关于ISP电路的问题 目前中发的一块89c52的仿真板大概多少钱

Copyright © 2005-2006 电子技术学习网 和 电子电路图网 均为 单片机设计网旗下网站