共2条 1/1
1
跳转至
页
I2C,pcf8563,ove7620,gcc I2C读写pcf8563和ove7620的gcc例子
问 共享一下。改自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}
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<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{
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 一下不行啊!
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
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<
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
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 一下不行啊!
共2条 1/1
1
跳转至
页
回复
有奖活动 | |
---|---|
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! | |
“我想要一部加热台”活动,不花钱赢取开发好工具!活动开始了哦 | |
【有奖活动】伙伴们:您的“需求”解决了吗? | |
抽奖了,抽奖了,金升阳医疗电源 |
打赏帖 | |
---|---|
放大↔震荡被打赏50分 | |
【换取手持数字示波器】HMI开发板首秀RTduino被打赏30分 | |
电解电容引发的问题被打赏50分 | |
【换取手持数字示波器】+AT-START-F405之串口通讯被打赏30分 | |
【换取手持数字示波器】BeetleESP32C6+OLED被打赏40分 | |
【换取手持数字示波器】+ESP32C6与PWM(脉冲宽度调制)被打赏30分 | |
【换取手持数字示波器】+BeetleESP32C6初步探入,点灯被打赏30分 | |
【换取手持数字示波器】+pico驱动点阵屏被打赏40分 | |
玩转“DFRobot盖革计数器模块”+【安信可BW16-Kit】MQTTBasic被打赏40分 | |
玩转“DFRobot盖革计数器模块”+remotecontrol分享被打赏30分 |