S3C2440 IIC读写AT24C02A

发布者:梦想学院最新更新时间:2017-11-27 来源: eefocus关键字:S3C2440  IIC读写  AT24C02A 手机看文章 扫描二维码
随时随地手机看文章

S3C2440读写AT24C02A只需要采用主机发送模式和主机接收模式即可,手册上提供有这两个模式的流程图,可以参考。

 

AT24C02A有几点需要注意的:

1.AT24C02A连续读多个字节时最后一个字节不用产生应答信号。

2.读的时候要先用写的方式写入硬件地址写方式和数据地址,此时不用发送STOP信号,接着继续写入硬件地址读方式,然后开始读数据。

3.其写的方式只有单字节写或者页写两种,页写时每次只能写一页不能超过,AT24C02A的一页大小是8字节。

 

 

以下是程序:

#include "uart.h"
#include "2440addr.h"
#include "iic_lhg.h"

#define U32 unsigned int
#define devaddr 0xa0

//设置IIC时钟,PCLK=50M,IICCLK=50M/16,Tx CLOCK=IICCLK/11=284.09KHZ
#define rIICCON_init (1<<7)|(1<<5)|(0xa)

void delay_iic(int a,int b)
{
 int c;
 if (a==0 || b==0)
 return;
 while (a--)
 for (c=0;c 
}

void __irq iicINT(void) //中断函数
{
 Uart_Printf("waring:now in iicINT function!!!");
 rSRCPND |= 0x1<<27;//清除IIC中断标志位
 rINTPND |= 0x1<<27;
}

void wait_ack(void)//等待传输完成
{
 while (!(rSRCPND&0x1<<27));
 rSRCPND |= 0x1<<27;//清除IIC中断标志位
 rINTPND |= 0x1<<27;
}

void write_at24c02a_byte(char addr,char da)//随机写

  
  rIICDS = devaddr;//写硬件地址到IICDS
  rIICCON&=~0x10;//清标志位
  delay_iic(2,5);//延时一小会
  rIICSTAT = 0xf0;
  wait_ack();//等待传输完成
   
  rIICDS = addr;//写传输地址

  rIICCON&=~0x10;//清标志位
  wait_ack();//等待传输完成
  
  rIICDS = da;
  rIICCON&=~0x10;//清标志位
  wait_ack();//等待传输完成
  
  rIICSTAT = 0xd0;  
  delay_iic(20,10);//延时一会等待停止
  rIICCON = rIICCON_init;
}

void write_at24c02a(char addr,char da[],int n)//写函数地址、要写的数据、数据的个数

  int i;
  i=0;
  
  if (n<1)
  return;
 
  for (i=0;i  {
   write_at24c02a_byte(addr+i,da[i]);
  }
  
}

void read_at24c02a(char addr,char da[],int n)//读数据addr地址,*da为指向读出的数组,n为个数
{
  int i;
  i=0;
  if (n<1)
  return;
  
  ////////////////////
  rIICDS = devaddr;//写硬件地址到IICDS
  rIICCON&=~0x10;//清标志位
  rIICSTAT = 0xf0;
  wait_ack();//等待传输完成
   
  rIICDS = addr;//写传输地址
  rIICCON&=~0x10;//清标志位
  wait_ack();//等待传输完成
  /////////////////////
  rIICDS = devaddr;//写硬件地址到IICDS
  rIICCON&=~0x10;//清标志位  
  rIICSTAT = 0xb0;
  wait_ack();//等待传输完成
  
  da[i] = rIICDS;
  rIICCON&=~0x10;//清标志位
  wait_ack();//等待传输完成
 // Uart_Printf("/r/nLHG:addr=%d c=%c /r/n",da[0],da[0]);
  while(1)
  {
  
  
   if (i>=n)//STOP?
   {
    //stop
    rIICSTAT = 0x90;
    
    delay_iic(20,50);//延时一会等待停止
    
    rIICCON = rIICCON_init;
    return;//写入结束
   }
   if (i==n-1)
    rIICCON &= ~0x80;      //读最后一个字节时不再响应
   da[i] = rIICDS;
   rIICCON&=~0x10;//清标志位
   wait_ack();//等待传输完成
   i++;
  }  
}

void iic_lhg_init(void)//初始化
{
 pISR_IIC = (U32)iicINT;
 
 rGPECON &= ~((U32)0xf<<28);//设置GPIO为IIC功能
 rGPECON |= (U32)0xa<<28;
 rIICCON = rIICCON_init;//设置IIC时钟,PCLK=50M,IICCLK=50M/16,Tx CLOCK=IICCLK/11=284.09KHZ
  //关于中断
 rINTMOD &= ~((U32)0x1<<27);
 rSRCPND |= (U32)0x1<<27;//清除IIC中断标志位
 rINTPND |= (U32)0x1<<27;
 rINTMSK |= (0x1<<27);   //禁止中断,现在不使用中断
}


关键字:S3C2440  IIC读写  AT24C02A 引用地址:S3C2440 IIC读写AT24C02A

上一篇:AMR中宏的使用与结构化内存表的建立
下一篇:s3c2440 外中断的按钮实现

推荐阅读最新更新时间:2024-03-16 15:47

S3C2440开发板学习——openjtag下载BootLoader
首先,将oflash.exe和FTD2XX.dll放置于C:WindowsSystem32文件夹中,使Dos可以执行oflash命令; 其次,在DOS命令中进入BootLoader所在的文件夹,使用cd+绝对路径,选择uboot.bin的文件路径; 然后,执行oflash命令,选择eeprom、IC、address、下载程序(u-boot.bin)等参数; 最后,启动程序程序通过openjtag口,将程序下载到开发板。 注意问题: 1、nand/nor flash的异同。相似点:nor flash 和nand flash均属于eeprom,可以进行反复的程序擦拭和读写。区别点
[单片机]
S3C2440串口(1)
1.S3C2440串口概述 串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致: TTL/CMOS电平: CMOS电平: 常用的电平转换芯片是MAX3232。 S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。 UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。 2.串口设置及相关寄存器 串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。 TXD0 –
[单片机]
S3C2440_时钟和电源管理_阅读开发手册记录
1、如何进入sleep mode   1)要把一些重要的数据存放在状态寄存器里,状态寄存器里的数据在掉电后不会丢失。   2)要设置好唤醒源   3)配置相关寄存器,使其进入sleep mode 2、如何从sleep mode 转换为 normal mode   1)给唤醒引脚唤醒信号 3、相关寄存器   1)LOCK TIME COUNT REGISTER(LOCKTIME)   2)MPLL CONTROL REGISTER   3)UPLL CONTROL REGISTER   4)CLOCK CONTROL REGISTER(CLKCON)   5)CLOCK SLOW CONTROL (CL
[单片机]
S3C2440_时钟和电源管理_阅读开发手册记录
S3C2440之SDRAM
前言 本文记录的是内存控制器如何访问SDRAM 测试程序:如果能成功访问SDRAM,就把LED点亮 一、思维导图 二、代码 关键代码 init.c(示例): #include S3C2440.h void sdram_init(void) { BWSCON = 0x22000000; BANKCON6 = 0x18001; BANKCON7 = 0x18001; REFRESH = 0x8404F5; BANKSIZE = 0xb1; MRSRB6 = 0x20; MRSRB7 = 0x20; } int sdram_test(void) { volat
[单片机]
<font color='red'>S3C2440</font>之SDRAM
s3c2440裸机-LCD编程(六、LCD上显示字符)
1.字库的移植 字符也是由点构成的,一个个点组成的点阵,其实本质上要显示文字就是把字库移植到对应的自己型号相匹配的board上,字库中的每一个字符都是一些点按照对应格式组合成的集合。 从linux内核源码中随便挑选一个字库文件,比如linux-4.18.16/lib/fonts这个目录下就有对应的很多字库文件。在这里我挑选font_8x16.c,如下图: 其中8x16表示每个字符所占的像素点的大小,表示每个字符占的大小为长*宽=8*16个像素点。 我们来看下一个字符'A'是如何显示的?从font_8x16.c我们找到字符'A'的数据,如下图: 那么我们如何让font_8x16.c这个字库
[单片机]
<font color='red'>s3c2440</font>裸机-LCD编程(六、LCD上显示字符)
基于LabVIEW8.6和S3C2440的手持数字波形表的界面设计
将LabVIEW设计的虚拟仪器程序移植到运行WindowsCE的便携式手持设备上。可以极大地提高嵌入式系统软件开发效率。具体提出一种有效解决数据波形交替显示的界面设计,阐述了如何使用LabVIEW的触摸屏toueh panel模块开发的数字波形表用于Windows CE 5.0设备的测试项目的案例。 1 开发平台简介 1.1 基础平台 本文设计的数字波形表采用高性能、低功耗、高集成度的S3C2440A微处理器。触摸屏配合采用S3C2440A的高速处理器驱动,具有更好的视频显示效果。 1.2 软件平台 LabVIEW是美国国家仪器公司推出的一种虚拟仪器开发平台。LabVIEW包含有很多的模块,touch panel模块
[单片机]
基于LabVIEW8.6和<font color='red'>S3C2440</font>的手持数字波形表的界面设计
s3c2440时钟与电源管理笔记
一、总述 S3c2440时钟电源管理模块分为三个部分:时钟,电源,USB控制。 时钟控制逻辑可以提供s3c2440所需要的三种时钟: FCLK for CPU, HCLK for the AHB总线设备, and PCLK for the APB总线设备。S3c2440有两个锁相环:一个可以为FCLK, HCLK ,PCLK提供时钟;另一个可以为USB模块提供48MHZ的总线时钟。时钟控制逻辑也可以在不使用锁相环的情况下产生低频时钟,并能通过软件选择是否为外围设备提供时钟。 S3c2440的电源管理模块可以激活四种状态:标准,慢速,空闲,睡眠模式。 标准模式;该模块为CPU和所有外围设备提供时钟。 低速模式:该模式锁相环
[单片机]
S3C2440 -- 启动文件和Makefile文件分析
Nand Flash 或者 Nor Flash启动 S3C2440有4KB SRAM,Nand Flash启动的话,硬件自动将Nand Flash的前4KB 拷贝到SRAM中,然后CPU由地址0开始执行。Nor Flash启动的话,可以像内存一样读,所以CPU如果从Nor Flash启动的话,CPU仍将从0地址启动,但是此时0地址指向Nor Flash地址;Nor Flash具有的特征:可以像内存一样读数据,但是不能像内存一样写数据,必须先擦除之后才能写数据到Nor Flash。 GCC编译流程:预编译,编译,汇编,连接 编译:.c - .s; 汇编:.s - .o ;连接:多个.o问价合并一个可执行文件 Makefile文件内容
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved