移植并修改成功的模拟iic读写EEPROM at24c02
2010-04-24 12:58:00
注:如果要读24c128或264,地址位为16位的。现在的地址位为8位。
protues仿真图
源程序如下:
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define I2C_DDR DDRB
#define I2C_PORT PORTB
#define I2C_PIN PINB
#define SDA PB1
#define SCL PB0
#define SDA_OUT()
(I2C_DDR |= (1<<SDA))
#define SCL_OUT() (I2C_DDR |= (1<<SCL))
// 释放SDA,上拉输入
#define SDA_RLS() do{ I2C_PORT |= (1<<SDA); I2C_DDR &=
~(1<<SDA); }while(0)
#define SCL_RLS() do{ I2C_PORT |= (1<<SCL); I2C_DDR &=
~(1<<SCL); }while(0)
#define SDA_SET() (I2C_PORT |= (1<<SDA))
#define SDA_CLR() (I2C_PORT &= ~(1<<SDA))
#define SCL_SET() (I2C_PORT |= (1<<SCL))
#define SCL_CLR() (I2C_PORT &= ~(1<<SCL))
#define READ_SDA() ((I2C_PIN & (1<<SDA)) ? 1 : 0)
#define
i2c_delay() delay_us(1) // 根据系统时钟进行调整
#define AT24C02_WRITE_ADDR 0xA0
#define AT24C02_READ_ADDR 0xA1
#define PAGE_SIZE 8
#define PAGE_MASK (PAGE_SIZE-1)
// 发送起始信号
void i2c_start(void)
{
SDA_SET();
i2c_delay();
SCL_SET();
i2c_delay();
SDA_CLR();
i2c_delay();
SCL_CLR();
//i2c_delay();
}
// 发送停止信号
void i2c_stop(void)
{
SDA_CLR();
i2c_delay();
SCL_SET();
i2c_delay();
SDA_SET();
// i2c_delay();
}
// 向总线写1字节,并返回从机有无应答
unsigned char i2c_write(unsigned char byte)
{
unsigned char i, ack;
ack = 0;
for( i = 0; i < 8; ++i ){
if ( byte & 0x80)
SDA_SET();
else
SDA_CLR();
byte <<= 1;
SCL_SET();
i2c_delay();
SCL_CLR();
}
SDA_RLS();
i2c_delay();
SCL_SET();
i2c_delay();
ack = READ_SDA();
SCL_CLR();
i2c_delay();
SDA_OUT();
return ack;
}
// 读1字节,ack=1时,发送ACK,ack=0,发送nACK
unsigned char i2c_read(unsigned char ack)
{
unsigned char i, r = 0;
SDA_RLS();
for( i = 0; i < 8; i++ ){
SCL_SET();
i2c_delay();
r <<= 1;
if ( READ_SDA() == 1)
{
r |= 1;
}
SCL_CLR();
i2c_delay();
}
SDA_OUT();
// Send ACK
if (!ack)
SDA_SET(); // Send nACK
else
SDA_CLR(); // Send ACK
i2c_delay();
SCL_SET();
i2c_delay();
SCL_CLR();
i2c_delay();
return r;
}
void at24c02_write1byte(unsigned
int byte_addr, unsigned char byte)
{
i2c_start();
i2c_write(AT24C02_WRITE_ADDR);
//i2c_write(byte_addr>>8); //输入15-9高位
i2c_write(byte_addr);
i2c_write(byte);
i2c_stop();
delay_ms(20); // 等待10ms,保证24C02内部写操作完成
}
void at24c02_page_write(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
unsigned char i;
i2c_start();
i2c_write(AT24C02_WRITE_ADDR);
i2c_write(byte_addr);
for( i = 1; i <= num; ++i )
{
i2c_write(*buff);
buff++;
}
i2c_stop();
delay_ms(20);
}
void at24c02_writenbytes(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
unsigned char n_tmp;
n_tmp = PAGE_SIZE - (unsigned char)(byte_addr &
PAGE_MASK); // 本页内剩余空间数量
if ((num > n_tmp) && (n_tmp != 0))
{
// 先将本页剩余空间写满
at24c02_page_write(byte_addr, buff,
n_tmp);
byte_addr += n_tmp;
num -= n_tmp;
buff += n_tmp;
}
while( num >= PAGE_SIZE ){
at24c02_page_write(byte_addr, buff,
PAGE_SIZE);
byte_addr += PAGE_SIZE;
num -= PAGE_SIZE;
buff += PAGE_SIZE;
}
if (num != 0)
{
at24c02_page_write(byte_addr, buff,
num);
}
}
unsigned char
at24c02_read_curr_addr(void)
{
unsigned char data;
i2c_start();
i2c_write(AT24C02_READ_ADDR);
data = i2c_read(0); // 读1字节,返回nACK
i2c_stop();
return data;
}
unsigned char
at24c02_read1byte(unsigned char byte_addr)
{
unsigned char data;
i2c_start();
i2c_write(AT24C02_WRITE_ADDR);
//i2c_write(byte_addr>>8); //输入15-9高位
i2c_write(byte_addr);
i2c_start();
i2c_write(AT24C02_READ_ADDR);
data = i2c_read(0); // 读1字节,返回nACK
i2c_stop();
return data;
}
void at24c02_readnbytes(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
unsigned char i;
i2c_start();
i2c_write(AT24C02_WRITE_ADDR);
i2c_write(byte_addr);
i2c_start();
i2c_write(AT24C02_READ_ADDR);
for( i = 1; i <= num-1; ++i )
{
*buff =
i2c_read(1); // 读1字节返回ack
buff++;
}
*buff = i2c_read(0);
i2c_stop();
}
void port_init(void)
{
PORTA=0xff;
DDRA=0xff;
SDA_OUT();
SCL_OUT();
}
void main(void)
{
unsigned char temp1[8]={1,2,3,4,5,6,7,8};
unsigned char temp2[8]={0};
port_init();
at24c02_writenbytes(0x03,temp1,8);// write the byte 01h at
address 03h
at24c02_readnbytes(0x03,temp2,8); // read the
byte 01h at address 03h
//SDA_RLS() ;
//SCL_RLS() ;
while (1)
{
if(temp2[0]==1)
{
PORTA=0XFE;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[1]==2)
{
PORTA=0XFD;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[2]==3)
{
PORTA=0XFB;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[3]==4)
{
PORTA=0XF7;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[4]==5)
{
PORTA=0XEF;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[5]==6)
{
PORTA=0XDF;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[6]==7)
{
PORTA=0XBF;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
if(temp2[7]==8)
{
PORTA=0X7F;
delay_ms(100);
PORTA=0XFF;
delay_ms(50);
}
}
}
移植并修改成功的模拟iic读写EEPROM at24c02的更多相关文章
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- MSP430F149模拟IIC读写24C02程序
板子上设置了EEPROM存储器,型号为AT24C02.板子的硬件连接为:SCL--->P2.4,SDA--->P2.5.直接了当,贴上程序! ======================= ...
- 软件模拟IIC实现EEPROM
....妈的太难. 反正就是控制引脚的高低电平 实现数据的读取....参考 I2C的协议层和物理层的那个几个图,个个信号产生的电平 自己看源码去把. 头疼
- C51—模拟IIC总线实现EEPROM存取数据
a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...
- STM32F10x_模拟I2C读写_硬件I2C读写
STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...
- IIC协议建模——读写EEPROM
案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
随机推荐
- linux 查看磁盘读写:iostat
iostat命令用来查看磁盘IO的读写情况,用法如下: 安装iostat命令 [root@mysql ~]# yum install -y sysstat [root@mysql ~]# iostat ...
- SELinux介绍
SELinux概念 安全加强的Linux,早期的Linux系统安全由系统管理员控制.SELinux就是一些安全规则的集合,类似于人类生活中的法律. DAC: 自由访问控制(以前的linux版本) ...
- C# List去重的三种方法
三种去重的方法 1.List中的元素实现IEquatabe接口,并提供Equals方法和GetHashCode方法. 2.使用表达式 users.Where((x,i)=>users.FindI ...
- 爬虫mm131明星照片
''' 1. 爬取以下站点中各个明星图片,分别单独建文件夹存放. 起始URL地址:http://www.mm131.com/mingxing ''' import os import logging ...
- 百度接口test
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Mk2Orf5pqEOXvYR ...
- vue axios get请求参数为json对象 而非字符串形式
axios get请求方式 传递给后台的参数都是字符串下形式,无法传递json对象 或数组对象等 post请求方式则可以实现, 但若后台接口要求必须用get方式传递对象给后台,需要装插件,实 ...
- vant - 头部 - header【Layout 布局】【Icon 图标】
安装 npm i vant -S [main.js] import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant); [ind ...
- 第一弹:超全Python学习资源整理(入门系列)
随着人工智能.大数据的时代到来,学习Python的必要性已经显得不言而喻.我经常逛youtube,发现不仅仅是以编程为职业的程序员,证券交易人员,生物老师,高级秘书......甚至许多自由撰稿人,设计 ...
- CentOS6.5安装python3.7
1.下载python3 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 2.解压 [root@mycentos ~]# ta ...
- MSSqlServer 主从同步复制原理(发布/订阅)
基本模型 1.发布类型: 快照发布:用于为事务复制和合并复制提供初始数据集:在适合数据完全刷新时也可以使用快照复制.利用这三种复制,SQL Server 提供功能强大且灵活的系统,以便使企业范围内的数 ...