历史上的今天
今天是:2025年07月21日(星期一)
2018年07月21日 | C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)
2018-07-21 来源:eefocus
/*
名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)
说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。
和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号
(如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。
*/
//定义I2C相关变量
sbit SCL=P2^1; //I2C 时钟
sbit SDA=P2^0; //I2C 数据
bit ack; /*应答标志位*/
static void Delay_I2C() /*延时函数*/
{
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
}
//启动I2C总线,即发送I2C起始条件:SCL为高电平期间,SDA出现下降沿
void Start_I2C()
{
SDA = 1;
Delay_I2C(); //延时一段时间
SCL = 1;
Delay_I2C();
SDA = 0;
Delay_I2C();
SCL = 0; //??? /*钳住I2C总线,准备发送或接收数据 */
Delay_I2C();
}
//停止I2C总线信号,即发送I2C停止条件:SCL为高电平期间,SDA出现上升沿
void Stop_I2C()
{
SDA = 0;
Delay_I2C(); //延时一段时间
SCL = 1;
Delay_I2C();
SDA = 1;
Delay_I2C();
}
//检验应答信号
bit CheckAck(void)
{
bit val;
/*发送完一个字节后检验设备的应答信号*/
SDA=1;
SCL=1;
Delay_I2C();
val=SDA;
Delay_I2C();
SCL=0;
Delay_I2C();
return val;
}
//通过I2C总线发送一个字节
bit SendByte_I2C(unsigned char c)
{
unsigned char i = 0;
SCL = 0; //??? /*钳住I2C总线,准备发送或接收数据 */
Delay_I2C();
for(i = 0;i<8;++i)
{
if(c<
SDA = 1;
else
SDA = 0;
SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/
Delay_I2C();
SCL = 0;
Delay_I2C(); //???
}
return CheckAck(); //返回接收方的确认结果
}
//从I2C总线中接收一个字节的数据
unsigned char RecByte_I2C()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; /*释放总线*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=0; /*置时钟线为低,准备接收数据位*/
Delay_I2C();
SCL=1; /*置时钟线为高使数据线上数据有效*/
Delay_I2C();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
Delay_I2C();
}
SCL=0;
Delay_I2C();
return(retc);
}
//发送应答信号
void Ack_I2C(bit ack)
{
if(ack==0)
SDA=0; /*在此发出应答或非应答信号 */
else
SDA=1;
Delay_I2C();
SCL=1;
Delay_I2C();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
Delay_I2C();
}
史海拾趣
|
零基础学单片机视频教程——03讲 寄存器仿真实例 51系列单片机包含有4组通用工作寄存器,寄存器组0~3。每组通用工作寄存器包含8个寄存器R0~R7。本讲演示了如何在程序中选择不同的通用寄存器组,以及如何在程序调试运行 ...… 查看全部问答> |
|
下载地址 http://download.csdn.net/source/2640670 最快的ARM指令集模拟器(性能是qemu的两倍),支持ARM7,ARM9,ARM11,Cortex/Thumb,可直接运行ELF和WINCE程序。(含测试代码, ELF测试程序用armcc或者arm gcc编译,WINCE程序用pb等编译) This is ...… 查看全部问答> |
|
请教:做STM32 IAP的时候,用官方的例子下载后可以引导应用程序运行,自己写的不行 同一个bin文件,都是从0x8002000地址处编程 现在想读出来看看是不是我的根官方的编进去的数据不一样,有什么工具可以读出flash里的数据吗?&n ...… 查看全部问答> |
|
整理电脑发现里面还有自己整理的一些资料,招了一个比较齐全的发上来分享给大家。 这个文件夹里是一套制作读卡器的整套资料,包括电路图PCB、源代码程序和相关的datasheet和资料。需要的朋友拿去吧。… 查看全部问答> |
|
请问:这个(void *) &PieVectTableInit;是什么语法结构?(void *) 到底什么意思? void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *) &PieVectTableInit; //这是怎么指向的,能否说明一下?谢谢。 &nb ...… 查看全部问答> |
|
#include \"msp430g2553.h\"void main(){ // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; //主系统时钟切换为外部高 ...… 查看全部问答> |
|
今天看了看电子节气门 里面提到 一个名词 叫做 节气门控制单元。。。。。这个所谓的节气门控制单元是不是 单片机啊??(我猜的啊) 还有个驱动电路模块 这是什么啊??? ...… 查看全部问答> |




