共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<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 一下不行啊!
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 一下不行啊!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |