I2C单片机驱动程序
时钟芯片PFC8563驱动程序
1.PFC8563.h头文件void I2C_start(void);//开启I2Cvoid I2C_stop(void);//停止I2Cvoid I2C_write_date(uchar date);//写一字节数据uchar I2C_read_date(void);//读一字节数据uchar I2C_receive_ACK(void);//单片机发送数据时uchar I2C_send_ACK(uchar ACK);//单片机接收数据时是否应答ACK为1时不应答,为0时应答void PF8563_write_date(uchar address,uchar date);//指定地址写数据uchar PF8563_read_date(uchar address);//读数据void PF8563_init(void);//时间初始化2.PFC8563.c函数#include <iom8515.h>#include <iomacro.h>#include <inavr.h>#include "1602.h"#include "delay.h"#include "PFC8563.h"#define sda1 DDRD|=0X02;PORTD|=0X02;#define sda0 DDRD|=0X02;PORTD&=0XFD;#define scl1 DDRD|=0X04;PORTD|=0X04;#define scl0 DDRD|=0X04;PORTD&=0XFB;#define sdar DDRD&=0XFD;PORTD|=0X02;//PD2>>SCL(串行时钟线) PD1>>SDA(串行数据线)void I2C_start(void)//开启I2C{sda1;delay_nus(2);scl1;delay_nus(2);sda0;delay_nus(2);}void I2C_stop(void)//停止I2C{sda0;delay_nus(2);scl1;delay_nus(2);sda1;delay_nus(2);}void I2C_write_date(uchar date)//写一字节数据{uchar i;for(i=0;i<8;i++){if(date&0x80){sda1;}else{sda0;}scl1;delay_nus(2);scl0;delay_nus(2);sda0;delay_nus(2);date<<=1;}}uchar I2C_read_date(void)//读一字节数据{uchar date=0;uchar i;for(i=0;i<8;i++){date<<=1;scl1;delay_nus(1);sdar;delay_nus(2);if(PIND&0x02)date&=0x01;scl0;delay_nus(2);}return date;}uchar I2C_receive_ACK(void)//单片机发送数据时{sdar;//上拉电阻拉高信号线delay_nus(2);scl1;//应答时钟脉冲delay_nus(2);if(PIND&0X02)//应答非则为1{scl0;return1;}else{scl0;return0;//应答则为0}}uchar I2C_send_ACK(uchar ACK)//单片机接收数据时是否应答ACK为1时不应答,为0时应答{if(ACK){sda1;}else{sda0;}delay_nus(2);scl1;delay_nus(2);scl0;delay_nus(2);}void PF8563_write_date(uchar address,uchar date)//指定地址写数据{I2C_start();I2C_write_date(0xa2);while(I2C_receive_ACK());I2C_write_date(address);while(I2C_receive_ACK());I2C_write_date(date);while(I2C_receive_ACK());I2C_stop();}uchar PF8563_read_date(uchar address)//读数据{uchar date;I2C_start();I2C_write_date(0xa3);while(I2C_receive_ACK());I2C_write_date(address);while(I2C_receive_ACK());date=I2C_read_date();I2C_send_ACK(1);I2C_stop();return date;}void PF8563_init(void)//时间初始化{PF8563_write_date(0x02,0x30);//秒PF8563_write_date(0x03,0x30);//分PF8563_write_date(0x04,0x16);//时PF8563_write_date(0x05,0x08);//日PF8563_write_date(0x06,0x02);//星期PF8563_write_date(0x07,0x12);//月PF8563_write_date(0x08,0x15);//年}。
软件模拟I2C总线的C51实现.
软件模拟I2C总线的C51实现摘要:介绍51系列单片机上的I2C总线主节点模拟程序,从而实现与具有I2C接口的器件通信。
1I2C总线简介1.1硬件结构I2C串行总线支持所有NMOS、CMOS、I2L工艺制造的器件。
从物理上看由两根双向I/O线组成,一根为数据线(SDA),一根为时钟线(SCL),通过这两根线把所有器件连接到总线上,并通过SDA和SCL在各器件间传递信息(根据地址识别每个器件)。
SDA和SCL通过上拉电阻接正电源,总线空闲时,两根线都是高电平。
这两根I/O线在电气上允许“线与”操作,其输出的驱动形式为集电极开路或漏极开路。
根据通信速度的不同,I2C总线分为三种工作模式:标准模式、快速模式和高速模式。
它们分别对应不同的波特率:100kb/s、400kb/s和3.4Gb/s。
总线上允许的设备数以总线上的电容量不超过400pF为限。
1.2数据传输I2C总线上数据为同步传输。
挂在I2C总线上的每一个器件都有一个独立的地址,而且在传输过程中有主节点和从节点的区分,主节点的作用是启动和结束一次通信,并负责控制总线时钟,总线上可以有多个主节点或多个从节点,但是在一次通信中只能有一个节点作为主节点。
主从机之间一次数据的传输称为一帧,由启动信号、地址信息、应答位及停止位组成。
其传送格式见图1。
2MCS-51与I2C总线芯片接口及程序2.18051经I2C总线扩展存储器PCF8582对于内部没有硬件I2C总线接口的51系列单片机,可以采用软件模拟的方法实现I2C总线接口功能。
硬件连接如图2所示。
用8051的P1.6和P1.7作为I2C总线的SCL利SDA信号,在总线上连接256*8的EEPROM芯片PCF8582。
8051单片机与PCF8582进行数据传递时,首先传送器件的从机地址SLA,格式如下:START为起始信号,从机地址的固定部分是4位——1010,可编程部分由,则该片的从机地址为引脚A2、A1、A0确定。
STM32单片机的ADS1115通过模拟I2C驱动
STM32单片机的ADS1115通过模拟I2C驱动注意:本部分代码需要只是ADS1115的部分程序(一些用到的数组在此没有写),模拟II2C的各程序并未给出,大家根据需要进行裁剪,代码完全开源,希望能帮到大家,也希望大家乐于分享。
调试时需特别注意I2C的通信问题,特别是应答信号的使用需要特别关注,本人的程序之前出错全是因为从机的应答信号的未使用造成。
收获:对于I2C通信协议的理解更加深刻,对ADS1115也能进行单通道的使用。
I2C的开始、发送/读写、应答、结束等一定要严格按照时序操作,ADS的操作还有所欠缺,仅仅会配置单通道,对于其他配置并没有关注,最近要把多通道的和阈值的配置也写好,到时再更新附录代码:#define CMD_Write 0x90 ////写入命令1001 0000 前7位表示ADS1115地址,最后1位0表示写#define CMD_Read 0x91 ////读取命令1001 001 前7位表示ADS1115地址,最后1位1表示读#define CMD_POINT_REG 0x00 ////指向寄存器配置#define CMD_CONF_REG 0x01 /////配置寄存器配置#define CONF_L 0xe3 ////低8位#define ADS1115_ADDR 0x90 /* ADS1115的设备地址,需配置*//**************************************************************************** **** Function Name :Confige1115* 参数:通道0/1/2/3* AttenTIon :配置ADS1115,根据需要的通道进行配置***************************************************************************** **/。
8051模拟i2C总线24c02读写源代码C语言
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
实例1
/* 51系列单片机在使用时,有时需要模拟I2C总线_nbsp; */
/* 这里举出一个实例(读写串行EEPROM芯片at24C02_nbsp; */
/************************************************************************/
Write_A_Page(myarray2,0x18);
mybyte=Read_One_Byte(0x20);
Read_N_Bytes(rdarray,16,0x10);
}
实例2
/********************************** I2C总线驱动 *************************************
}
void SEND_1(void)
{
/*发逿,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
stm32的ADS1110驱动程序(模拟I2C)
F:\单片机\ARM\程序\ADS1110.c
2013年1月8日 21:19
* 函数名称: TWI_START * 描 述: 发送启动 * * 输 入: 无 * 输 出: 无 * 返 回: 无 * 作 者: * 修改日期: 2012年10月20日 *******************************************************************************/ u8 TWI_START(void) { TWI_SDA_1; TWI_NOP; TWI_SCL_1; TWI_NOP; if(!TWI_SDA_STATE) { ////DebugPrint("TWI_START:BUSY\n"); return TWI_BUS_BUSY; } TWI_SDA_0; TWI_NOP; if(TWI_SDA_STATE) { ////DebugPrint("TWI_START:BUS ERROR\n"); return TWI_BUS_ERROR; } TWI_SCL_0; TWI_NOP; return TWI_READY; } /******************************************************************************* * 函数名称: TWI_STOP * 描 述: 发送停止位 * * 输 入: 无 * 输 出: 无 * 返 回: 无 * 作 者: * 修改日期: 2012年10月20日 *******************************************************************************/ void TWI_STOP(void) { TWI_SCL_0; TWI_NOP; TWI_SDA_0; TWI_NOP;
M6G2C 系列核心板产品数据手册_V1.01
广州周立功单片机科技有限公司修订历史目录1. 产品简介 (1)1.1硬件参数 (2)1.2软件参数 (2)1.3产品型号命名规则 (3)1.4选型对照表 (3)2. 性能参数 (4)2.1M6G2C核心板系统主要性能配置 (4)2.2M6G2C核心板通讯性能表 (4)2.3M6G2C核心板其他性能表 (4)2.4电源静态参数 (5)3. 引脚功能 (6)3.1引脚信息 (6)3.2M6G2C核心板引脚定义 (7)3.3M6G2C核心板引脚功能说明 (10)3.4M6G2C核心板引脚说明(按功能划分) (14)4. 系统硬件设计 (18)4.1M6G2C核心板接口 (18)4.2电源设计 (19)4.3百兆以太网电路 (20)4.3.1单路以太网收发器电路 (21)4.4USB电路设计 (22)4.5SD/MMC电路 (23)4.6蜂鸣器电路 (24)4.7RTC电路 (24)4.8LCD电路 (24)4.9RS232调试串口电路 (25)4.10启动配置电路 (26)4.11复位电路 (26)4.12指示灯 (27)5. 机械尺寸 (28)6. 免责声明 (30)1. 产品简介M6G2C系列核心板是广州周立功单片机科技有限公司开发的一系列以Freescalei.MX6UL处理器为核心的嵌入式工业控制核心板。
该核心板采用性能更优越的Cortex-A7内核处理器,可提供快速的数据处理和流畅的界面切换。
该系列产品自带8路UART、2路USB OTG、最高2路CAN-bus、最高2路以太网等通讯接口。
具有十分强大的工业控制通讯接口,可满足大部分工业应用、便携式消费电子、汽车电子等多个行业。
M6G2C系列核心板集成了i.MX6UL处理器、标配128/256MB DDR3和128/256MB NAND Flash、硬件看门狗、硬件加密等,具备完整的最小系统功能,可有效缩短用户的产品开发的周期。
核心板通过严格的EMC和高低温测试,保证核心板在严酷的环境下也能稳定工作。
IIC总线原理及其应用实例(基于Proteus仿真)
2012 年 8 月 11 日星期六
4、总线的寻址:
I2C 总线协议有明确的规定:采用 7 位的寻址字节(寻址字节是起始信号后的第一个字节)。 (1)寻址字节的位定义
D7~D1 位组成从机的地址。D0 位(R/W,read/write,读/写)是数据传送方向位, 为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。
(2)数据帧格式: I2C 总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。 在起始信号后必须传送一个从机的地址(7 位),第 8 位是数据的传送方向位(R/T),用 “0”表示主机发送数据(T,transmit 发送),“1”表示主机接收数据(R,receive 接收)。每 次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据 传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。 在总线的一次数据传送过程中,可以有以下几种组合方式: a、主机向从机发送数据,数据传送方向在整个传送过程中不变。如下图所示:
芯片引脚如右图所示,各引脚功能如下图所示: 24C 系列芯片地址的固定部分为 1010,A2、A1、A0 引脚接 高、低电平后得到确定的 3 位编码。形成的 7 位编码即为该器件的地址码。
6 / 17
2012 年 8 月 11 日星期六
注:SDA 即 serial data,串行数据 SCL 即 serial clock,串行时钟 WP 即 write protect,写保护
注:阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。 A 表示应答,A表示非应答(高电平)。S (start 开始)表示起始信号,P(pause 停止)表示终 止信号。
I2C与SPI的区别
I2C与SPI的区别⽂章引⽤skyflying的博客⼀IIC总线I2C--INTER-IC串⾏总线的缩写,是PHILIPS公司推出的芯⽚间串⾏传输总线。
它以1根串⾏数据线(SDA)和1根串⾏时钟线(SCL)实现了双⼯的同步数据传输。
具有接⼝线少,控制⽅式简化,器件封装形式⼩,通信速率较⾼等优点。
在主从通信中,可以有多个I2C 总线器件同时接到I2C总线上,通过地址来识别通信对象。
IIC接⼝的协议⾥⾯包括设备地址信息,可以同⼀总线上连接多个从设备,通过应答来互通数据及命令。
但是传输速率有限,标准模式下可达到100Kbps,快速模式下可达到400Kbps(我们开发板⼀般在130Kbps),⾼速模式下达到4Mbps,不能实现全双⼯,不适合传输很多的数据。
IIC总线是⼀个真正的多主机总线,总线上多个主机初始化传输,可以通过传输检测和仲裁来防⽌数据被破坏。
下来详细了解IIC总线时序:1.1总线数据有效性IIC总线是单⼯,因此同⼀时刻数据只有⼀个流向,因此采样有效时钟也是单⼀的,是在SCL时钟的⾼电平采样数据。
IIC总线上SDA数据在SCL时钟低电平是可以发⽣变化,但是在时钟⾼电平时必须稳定,以便主从设备根据时钟采样数据,如下图:1.2总线空闲条件IIC总线上设备都释放总线(发出传输停⽌)后,IIC总线根据上拉电阻变成⾼电平,SDASCL都是⾼电平。
1.3总线数据传输起始和结束条件IIC总线SCL⾼电平时SDA出现由⾼到低的跳变,标志总线上数据传输的开始条件IIC总线SCL⾼电平时SDA出现由低到⾼的跳变,标志总线上数据传输的结束条件1.4总线数据传输顺序以及ACK应答IIC总线上数据传输是MSB在前,LSB在后,从⽰波器上看,从左向右依次读出数据即可IIC总线传输的数据不受限制,但是每次发到SDA上的必须是8位,并且主机发送8位后释放总线,从机收到数据后必须拉低SDA⼀个时钟,回应ACK表⽰数据接收成功,我们如果⽰波器上看到的波形就是每次9位数据,8bit+1bitack。
HXD019单片机驱动c程序
if (count_0 >= 10)
//1ms * 1000 -> 1s
{
count_0 = 0;
//reset counter
ReceiveFlag = 1;
}
}
}
void time0_init()
{
TMOD = 0x01;
//16位计数器
TL0 = T1MS;
//初始 timer0 low byte
#define BAUD 9600
//UART baudrate
#define I2CERR_NO_ERROR 0
#define DELAY_TIME 15 //H: 25uS-45uS //第二步:调这个参数和下面的参数,使得每次读写时的SCl时 序如参考图所示:每个bite读写的时间是30us左右;
--------------------------------------------------------------------------------
******************************************************************************
#define DELAY_ST 20
//Hb:18mS-25mS
第一个下降沿和第二个下降沿之间的间隔是20ms左右
//#ifndef UINT8 typedef unsigned char UINT8;
//#endif
//#ifndef UINT16
typedef unsigned int UINT16;
SendData(ReceiveBuf2[i]); 的间隔至少0.8S,这里可以修改
单片机中的I2C总线接口设计原理及应用
单片机中的I2C总线接口设计原理及应用I2C(Inter-Integrated Circuit)是一种串行通信协议,广泛应用于单片机系统中的外设设备间的通信。
本文将介绍I2C总线接口的设计原理及应用,包括原理介绍、硬件设计要点、软件实现以及应用案例等。
一、I2C总线接口的原理介绍I2C总线是由飞利浦(Philips)公司于上世纪80年代提出的一种串行通信协议,它使用两根线(SDA和SCL)进行数据和时钟的传输。
其中,SDA线用于数据传输,SCL线用于时钟同步。
I2C总线接口的原理非常简洁,主要分为两个角色:主设备(Master)和从设备(Slave)。
主设备负责控制总线的访问和数据的传输,而从设备则响应主设备的指令,并将数据发送给主设备。
在I2C总线上,每个设备都有一个唯一的7位或10位地址。
主设备通过发送起始信号和目标设备的地址来选择与之通信的从设备。
通信的开始由主设备发送起始信号(Start),结束由主设备发送停止信号(Stop)。
数据传输过程中,起始信号和停止信号的边沿触发时机非常重要。
起始信号是在时钟高电平时,数据线由高电平转为低电平,而停止信号则是在时钟高电平时,数据线由低电平转为高电平。
数据传输是在时钟低电平时进行,每个时钟周期传输一个bit的数据,传输的顺序是从高位到低位,同时每传输完一个bit,需要由接收端发送应答信号。
二、I2C总线接口的硬件设计要点1. 电平转换器:由于I2C总线的工作电平是标准的3.3V或5V,因此需要使用电平转换器来适应不同的设备电平要求。
常用的电平转换器有双向电平转换器和单向电平转换器两种,选择合适的电平转换器可以提高系统的稳定性和兼容性。
2. 上拉电阻:I2C总线上的数据线(SDA)和时钟线(SCL)都需要连接上拉电阻,以确保在传输过程中电平稳定。
通常选择2.2kΩ到10kΩ的上拉电阻,使总线电平维持在高电平状态。
3. 保持电容:为了提高I2C总线的稳定性,可以在每个从设备的SDA和SCL线上连接一个保持电容。
i2c,lcd usb驱动
----杨军(2012 年 4 月 5 日)一、 uboot 启动流程第一阶段启动流程: cpu/arm920t/start.S(汇编阶段)进入 SVC-->关闭看门狗-->关闭中断-->进入 cpu_init_crit()--->(临时设置栈指针 SP)-->调整 CPU 的频率 clock_init() -->把完整的 {初始化 CPU 和 SDRAM 1.刷新出去 I/D cache 2.关闭 MMU 和 cache(一定关闭数据 CACHE,指令 CACHE 无所谓) 3.调用 lowlevel_init}UBOOT 代码从 FLASH 搬移到 SDRAM 中 CopyCode2Ram() -->清除 BSS、设置堆栈-->跳入真正的 C 函数 start_armboot第二阶段启动流程:使能 I/D cache,配置 GPIO 端口【board_init()】 -->:注册倒计时定时器,初始化一个早期串口-->输出 UBOOT 第一条打印 -->NOR/NAND FLASH 初始化-->把环境参数读到 SDRAM-->建立设备管理链表-->重新初始化串口为全功能串口-->网卡初始化-->进入 main_loop()大循环 第一二两个阶段合到一起的描述(这个过程要求面试的时候直接能够说的出来): UBOOT 的启动流程:首先初始化 CPU(进 SVC,关看门狗,关中断,调整 CPU 频率)和 RAM(SDRAM 和 DDR 都需要初始化一次), 将 FLASH 上的 BUOOT拷贝到 RAM 中,清除 BSS 和设置堆栈指针,跳转到 C 函数,接着初始化外设(GPIO 口设置,串口初始化,完整功能的 FLASH,, 网卡初始化),进入一个大的循环检测用户是否有按键按下,如有按下: 停止倒计时,等待用户的后续输入;若 规定时间里面 没有按下,执行 bootcmd 所保存的指令(经常这时是加载内核),然后启动内核二、 内核启动过程head.S arch\arm\boot\Compressed(解压内核)—》head.S arch\arm\Kernel(初始化工作)—》head-common.S arch\arm\Kernel(start_kernel 执行内核) start_kernel() [init/main.c] //vmlinux 的第一个 C 函数 -->setup_arch() 处理 UBOOT 传递过来的 TAG 参数(内存其实位置和大小,bootgars) 把 bootargs 参数各项进行拆解(后续代码可以用__setup()接收参数,例如: __setup("init=", init_setup);) 建立 4KB/页的内存管理,丢弃之前 arch/arm/kernel/head.S 中建立的 1MB/段的内存映射关系-->console_init(); //VMLINUX 的第一行打印输出 -->rest_init()Rest_init()函数分析:内核压缩过程:三、 I2C 驱动Random Read 时序图Byte Write 时序图:I2C 协议:1. i2c 协议特点: ============================================================================================== 1.1 它是飞利浦公司生产的一种串口协议 1.2 1.3 它是两根线传输的 SDA,SCl 数据时钟线 两根线上必须要由上拉电阻1.4 1.5 1.6可以挂多个设备,采用的是主从模式 I2c 的时钟都是由主机产生的 半双工通信方式 (SPI 全双工的,四根线,串行的)1.7 速度问题,低速模式:100K/s 全速模式:400k/s 高速模式:3.4M/s (SPI 的速度一般在 10M 左右) 1.8 真正的多主机总线(解释)1.9 串行 8 位双向传输,先传高位再传低位I2C 驱动分析:四、 LCD 驱动TFT LCD 的 TTL 信号 信号名称 VSYNC HSYNC HCLK VD[23:0] LEND PWREN Framebuffer 概述: 用户可以将 FramBuffer 看成是显卡内存的一个映像,将其映射到进程地址空 间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。
Proteus仿真I2C存储器实验
Proteus仿真I2C存储器实验一、实验目的1、了解I2C总线的工作原理2、掌握I2C总线驱动程序的设计和调试方法3、掌握I2C总线存储器的读写方法二、实验说明1、I2C总线常识I2C总线上的每个器件均由一个存储于该器件中的唯一地址来识别,并可被用作一个发送器或接收器(视其功能而定)。
AT24C02是一个2K位串行EEPROM,内部含有256个8位字节,AT24C02有一个8字节页写缓冲器,该器件通过I2C总线接口进行操作。
引脚名称和功能如图1所示。
图1 24系例I2C存储器引脚说明通过器件地址输入端A0、A1和A2可以实现将最多8个24C02器件连接到总线上。
2、I2C总线协议(1)只有在总线空闲时才允许启动数据传送。
(2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变。
时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
(3)起始信号,时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C总线的起始信号。
(4)停止信号,时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C 总线的停止信号。
I2C 总线时序:3、页写操作的数据帧结构根据页缓冲区的大小,页写的字节数不能超过缓冲区大小。
如果在发送停止信号之前主器件发送超过缓冲区大小,地址计数器将自动翻转,先前写入的数据被覆盖。
如图2所示。
图2页写操作数据帧结构三、实验内容先搭建一个“I2C存储器实验”的仿真电路,该单片机系统功能是采用页写的方式,把器件地址为A0H的24C02器件的片内50H地址开始的8个存储单元分别写入数据“00、11、22、、、、、、77”。
四、.参考硬件电路五、参考汇编程序SDA EQU P3.5 ;定义24c02的串行数据线SCL EQU P3.4 ;定义24c02的串行时钟线SNUM EQU 40HSLAW EQU 41HORG 0000HAJMP MAINORG 0040HMAIN:MOV SP,#5FHLCALL LDATAMOV SLAW,#0A0H ;24c02的器件地址MOV SNUM,#9 ;要发送9个字节数据MOV R1,#30H ;数据缓冲区的首地址CALL WRNB ;调用发送n个字节的子程序SJMP $LDATA:MOV R0,#30H ;片内ram的地址:30H 31H 32H 33H 34H 35H…..MOV @R0,#50H ;存放的数据:50H 00H 11H 22H 33H 44H……INC R0MOV @R0,#00HINC R0MOV @R0,#11HINC R0MOV @R0,#22HINC R0MOV @R0,#33HINC R0MOV @R0,#44HINC R0MOV @R0,#55HINC R0MOV @R0,#66HINC R0MOV @R0,#77HRET;起始信号STA:SETB SDASETB SCLNOPCLR SDANOPNOPCLR SCLRET;终止信号STP:CLR SDASETB SCLNOPNOPSETB SDANOPNOPCLR SDACLR SCLRET;发应答位"0" ASK:CLR SDASETB SCLNOPNOPCLR SCLSETB SDARET;发非应答位"1" NAS:SETB SDASETB SCLNOPCLR SCLCLR SDARET;应答位检查,正常应答时F0标志为0,否则F0为1 ASKC:SETB SDASETB SCLCLR F0MOV C,SDAJNC CEND ;应答位为1,不置位F0SETB F0CEND: CLR SCLRET;发送到24c02一个字节,预发送的数据存于A中WRB:MOV R0,#08HLOOP0:RLC AMOV SDA,CNOPNOPSETB SCLNOPNOPNOPNOPCLR SCLDJNZ R0,LOOP0RET;--------------------------------*;*函数名称:WRNB *;*功能描述:对E2PROM指定的页写入SNUM个字节的数据* ;*调用函数:STA WRB ASKC STP *;*入口条件:SLAW--I2C器件写地址*;* R1-片内RAM发送数据缓冲区的首地址* ;--------------------------------*WRNB:LCALL STAMOV A,SLAWLCALL WRB ;写器件的写地址LCALL ASKCJB F0, WRNBWLP: ;向E2PROM写入SNUM个字节的数据MOV A,@R1LCALL WRBLCALL ASKCJB F0, WRNBINC R1DJNZ SNUM, WLPLCALL STPRETEND六、思考练习题1、请说说I2C总线的优点有哪些?2、编写程序,将自己学号写入24C02地址为30H开始的存储单元。
PIC单片机IIC程序
I2C_delay();
err_count++;
if(err_count>10)
{
temp=1;
return;
}
}
po_DEMOD_SCL=0;
// I2C_SET_SCL(LOW1);
// I2C_Delay(I2C_LOW);
po_DEMOD_SCL=1;
// I2C_Delay(30);
dir_DEMOD_SDA=1;
//I2C_delay();
while(pi_DEMOD_SDA)
}
/*
void I2C_Send(unsigned char ccdata)
{
unsigned char temp,err_count;
temp=8;err_count=0;
dir_DEMOD_SCL=0;
dir_DEMOD_SDA=0;
}
I2C_delay();
po_DEMOD_SCL=1;
I2C_delay();
po_DEMOD_SCL=0;
ccdata<<=1;
}
//I2C_TxData(ccdata) ;
// I2C_SET_SDA(HIGH1);
unsigned char I2C_Recive(void)
{
unsigned char temp=8,buf;
dir_DEMOD_SDA=1;
I2C_delay();
////// I2C总线在标准的方式下最高时钟为100KHZ, ///////
////时钟信号最小低电平时段为4.7us,高电平时段不得小于4us. ///////
_整套24c16单片机读写驱动程序
用单片机实现通用存贮器IC卡的读写自动化仪表2002本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。
用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。
目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的AT24系列芯片。
以该系列中的AT24C01为例,它具有1k的存贮容量,适用于2V~5V的低电压/标准电压的操作,具有低功耗和高可靠性等优点。
而AT89C2051虽是ATMEL公司89系列单片机的低档型,但它具有2k的FLASH ROM(可重编闪速存贮器)、128×8位内部RAM及全静态操作方式,同样也具有低功耗和较强的功能。
下面以AT24C2051为例,对通用存贮器IC卡的工作原理及基本电路连线作一介绍,该线路简单,使用灵活,能可靠地对通用存贮器IC卡进行读写。
2 硬件特性AT24系列存贮器的特性AT24系列存贮器芯片采用CMOS工艺制造,内置有高压泵,可在单电压供电条件下工作。
其标准封装为8脚DIP封装形式,各引脚的功能说明如下:SCL:串行时钟。
在该脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。
SDA:串行数据。
该引脚为开漏极驱动,可双向传送数据。
A0、A1、A2:器件/页面寻址。
为器件地址输入端。
在AT24C01/02中,该引脚被硬连接。
Vcc:一般输入+5V的工作电压。
图1是符合ISO7816-2标准的IC卡的触点图(见IC卡书P186)。
对于AT24系列通用存贮器IC卡来说,通常只需使用四个触点。
AT24C01的内部组态为128个8位字节,而对随机字寻址则需要一个7位地址。
基于STM32的嵌入式系统设计实验_实验指导书
实验指导书(实验)课程名称:基于STM32的嵌入式系统设计实验电子科技大学教务处制表实验一 电路板焊接与调试一.实验简介完成实验板上部分元件的焊接,焊接完成后进行基本测试。
二.实验目的及原理掌握STM32F103实验板的基本原理,掌握焊接电路板的基本技能,掌握下载测试程序的基本方法。
原理:详细内容参考教材《基于STM32的嵌入式系统原理与设计》 MCU 和周边电路如图为MCU 及其周边电路。
图1 MCU 及其周边电路3.启动配置2.复位电路1.唤醒电路4.高速晶振电路7.AD 输入8.低速晶振电路5.AD 参考 电路6.后备电池1.唤醒电路,高有效,不按时接220K电阻下拉。
2.复位电路,低有效。
带RC启动复位。
3.配置启动,用跳线选择BOOT1和BOOT0接高电平或低电平。
4.高速晶振电路,采用8M晶振,在STM32内部倍频为72M。
5.AD参考电路,采用LC滤波,可跳线选择直接接VCC或通过TL431稳压电路产生的参考电压。
6.后备电池。
可通过跳线选择直接接VCC或电池。
7.AD输入,可选择使用RC滤波,共8路。
8.低速晶振电路,选用32.768kHz晶振,为产生准确的串口波特率。
USB转串口电路USB转串口电路可以方便没有串口的笔记本电脑用户通过USB接口下载代码到FLASH 中,及进行RS232串行通信。
图2 USB转串口接口电路USB转串口芯片是CP2102,该芯片稳定性较好。
当其正常工作的时候,灯LED6亮。
该芯片DP/D+引脚连MINI USB接口的脚3,DM/D-引脚连MINI USB接口的脚2,为一对USB 输入输出线。
TXD与RXD引脚接MCU的PA10(USART1_RX)和PA9(USART1_TX)。
I2C接口电路本书选择的EEPROM是AT24C02是256字节的电可擦出PROM,通过I2C协议与STM32进行通信,连接十分简单。
EEPROM虽然容量只有256字节,但是读写比较方便,与MCU 连线少,被广泛的使用在智能仪器、汽车电子、工业控制、家用电器等场合。
如何对AT24C02编写驱动程序——IIC总线协议
如何对AT24C02编写驱动程序——IIC总线协议AT24C02是一种2Kbit(256字节)的串行EEPROM芯片,采用I2C总线协议进行通信。
编写AT24C02的驱动程序需要了解I2C总线协议的工作原理以及AT24C02的读写操作。
以下是编写AT24C02驱动程序的步骤:1. 硬件配置:首先,需要在单片机上配置I2C总线的硬件连接。
I2C 总线需要两根信号线,即SDA(Serial Data Line)和SCL(Serial Clock Line)。
将SDA和SCL引脚连接到AT24C02的对应引脚,并通过上拉电阻将其拉高。
2.初始化I2C总线:在驱动程序中,需要初始化I2C总线的相关寄存器和配置参数。
这包括设置I2C总线的通信速率、使能I2C模块、使能中断等。
3.开始信号和设备地址:发送开始信号START,然后发送AT24C02的设备地址,设备地址由3位固定的值和一个读/写位组成。
读写位为0代表写操作,为1代表读操作。
4.发送数据:如果是写操作,发送要写入的数据到AT24C02的指定地址。
数据写入时,需要注意AT24C02的内存地址范围,以及页写操作的限制。
如果是读操作,发送读取的目标地址。
5.停止信号:传输完成后,发送停止信号STOP,结束通信。
6.延时和轮询:在I2C总线通信中,需要一定的延时等待数据传输完成。
在写入大量数据或读取数据时,还需要轮询等待操作完成。
7.错误处理:在驱动程序中,需要考虑到可能发生的错误和异常情况。
例如,设备地址未响应、通信超时、数据传输错误等,都需要进行相应的错误处理。
8.封装函数接口:为了方便上层应用调用,可以将上述操作封装成函数接口。
例如,提供读写函数、擦除函数和查询设备ID的函数等。
除了以上的驱动程序,还可以根据实际需求进行功能扩展。
例如,可以实现批量写入数据、随机读取数据、擦除操作等。
总之,编写AT24C02的驱动程序主要包括硬件配置、初始化I2C总线、发送开始信号和设备地址、发送数据、发送停止信号、延时和轮询、错误处理等步骤。
PIC单片机I2C通信程序
static bit PORTA_4 @ PORTAIT(PORTA,4);
static bit BF @ PORTAIT(SSPSTAT,0);
static bit TXSTA_5 @ PORTAIT(TXSTA,5); //*定义PORTB 0位*//
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x00; //初始化控制状态寄存器
CHECKSSPIF();
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器01
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器02
DELAY1(1);
time[3]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN=LAY1(1);
time[4]=SSPBUF;
SSPIF=0;
USART(0x69);
USART(0x6d);
USART(0x65);
USART(0x20);
USART(0x69);
USART(0x73);
USART(0x20);
USART(0x30);
USART(((time[3]&0xc0)>>4)+0x37);//year
I2C接口的EEPROM 24C64芯片的驱动方法
I2C接口的EEPROM24C64芯片的驱动方法与93C46类似的,24C64也是EEPROM,但不同的是24C64是I2C接口的,容量也要更大些,用来存储较大容量的数据,甚至在某些单片机中可以用作程序存储器。
24C64提供65536个位,它们是以字节方式进行组织的。
通过设置不同的地址,可以实现多达8个芯片共享两线总线。
它被广泛应用于工业、化工等需要低功耗与低电压的领域。
同时,它还提供诸如4.5V~5.5V、2.7V~5.5V、2.5V~5.5V与1.8V~5.5V各种工作电压范围的芯片,从而使其应用更加通用。
24C64的引脚定义:引脚功能详细描述:24C64的功能框图:引脚功能描述:串行时钟(SCL):在SCL的上升沿数据写入芯片中,在下降沿从芯片中读出数据。
串行数据(SDA):SDA用作双向数据传输。
这个引脚是漏极开路驱动,需要加上拉电阻。
设备地址(A2,A1,A0):A2~A0是设备地址设置引脚,可以通过接高或接低来设置不同的地址,也可以直接悬空。
设置为不同地址时最多可以在同一总线上存在多达8个芯片。
当这些引脚悬空时,默认地址为0。
写保护(WP):当此引脚接到GND上时,允许正常的写操作。
当WP接到V CC时,所有的写操作都是被禁止的。
如果悬空,则WP在内部被拉到GND。
24C64的组织方式:24C64在内部被组织为256个页,每个页32个字节。
可以按字节来进行操作,地址为13位。
24C64的操作方法:24C64是采用I2C接口来进行数据传输的,在这里不再介绍I2C接口数据传输的相关内容,具体的I2C总线协议在相关章节有详细讲解,敬请翻阅。
下面只针对于24C64的操作方法进行讲解。
1)设备寻址在开始条件使芯片使能后,需要给其写入一个8位的设备地址码,以使某一芯片被命中。
在地址码的开头有两个“10”序列,共4位,然后是3位的地址,最后是1位的读写标识位。
具体的地址码结构如下:24C64使用3个设备地址位A2、A1、A0使多达8个芯片同时存在于一条总线上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
_Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字节数据发送函数
函数原型: void SendByte(UCHAR c);
_Nop();
SCL=1; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/********************************************************************
unsigned char BitCnt;
retc=0;
SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
********************************************************************/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
/*************************此部分为I2C总线的驱动程序*************************************/
#include<reg52.h>
#include <intrins.h>
#include <I2C.H>
#define NOP() _nop_() /* 定义空指令 */
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
SCL=0; /*置时钟线为低,准备接收数据位*/
_Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/
_Nop();
_Nop();
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
#define _Nop() _nop_() /*定义空指令*/
sbit SCL=P1^5; //I2C 时钟
sbit SDA=P3^6; //I2C 数据
bit ack; /*应答标志位*/
_Nop();
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
_Nop();
_Nop();
_Nop();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
_Nop();
_Nop();
}
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此发出应答或非应答信号 */
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*时钟低电平周期大于4μs*/
发完后请用应答函数应答从机。
********************************************************************/
unsigned char RcvByte()
{
unsigned char retc;
应答子函数
函数原型: void Ack_I2c(bit a);
********************************************************************/