2440下的IIC实验

发布者:剑戟辉煌最新更新时间:2016-11-27 来源: eefocus关键字:IIC实验 手机看文章 扫描二维码
随时随地手机看文章

#include "2440addr.h"
extern void Uart_Printf(char *fmt,...);
void Wr24C02(U32 slvAddr,U32 addr,U8 data);
void Rd24C02(U32 slvAddr,U32 addr,U8 *data);
void Run_IicPoll(void);
void IicPoll(void) ;
void Delay(int x) ;
static U8 iicData[IICBUFSIZE];
static volatile int iicDataCount;
static volatile int iicStatus;
static volatile int iicMode;
static int iicPt;

 


void iicMain(void)
{
    unsigned int i,j;
    static U8 data[256];
    Uart_Printf("IIC Test(Polling) using AT24C02\n");
 
    //设置GPE15->IICSDA 和 GPE14->IICSCL
    rGPEUP  |= 0xc000;                  //Pull-up disable
    rGPECON &= ~0xf0000000;
    rGPECON |= 0xa0000000;              //GPE15:IICSDA , GPE14:IICSCL 
 
 //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
    rIICCON    = (1<<7) | (0<<6) | (1<<5) | (0xf);  //0xaf
    rIICADD  = 0x10;                    //2440 slave address = [7:1]
    rIICSTAT = 0x10;                     //IIC bus data output enable(Rx/Tx)
    Uart_Printf("Write test data into AT24C02\n");
   
 
//写入一个page的数据,page的大小是256byte,
    //page 的起始地址是0xa0,写入的数据是:0、1、2、...255。0xa0是AT24C02的页地址。
    //AT24C02的页地址是0x00/0x20/0x40/0x60/0x80/0xa0/0xc0/0xe0。
    for(i=0;i<256;i++)
       Wr24C02(0xa0,(U8)i,i);//U32 slvAddr,U32 addr,U8 data
      
      
    //初始化data数组的值为0。
    for(i=0;i<256;i++)
        data[i] = 0;
    Uart_Printf("Read test data from AT24C02\n");
    
    //读24C02的0xa0地址中数据到data数组中。
    for(i=0;i<256;i++)
        Rd24C02(0xa1,(U8)i,&(data[i])); 
    //输出data数组接收数据的值
    for(i=0;i<16;i++)
    {
        for(j=0;j<16;j++)
        Uart_Printf("%2x ",data[i*16+j]);
        Uart_Printf("\n");
    }
    Uart_Printf("OK! Write data is same to Read data!\n");
    while(1);
}


void Wr24C02(U32 slvAddr,U32 addr,U8 data)
{
    iicMode      = WRDATA;
    iicPt        = 0;
    iicData[0]   = (U8)addr;
    iicData[1]   = data;
    iicDataCount = 2;
    
    //8-bit data shift register for IIC-bus Tx/Rx operation.
    rIICDS        = slvAddr;            //0xa0
    
    //Master Tx mode, Start(Write), IIC-bus data output enable
        //Bus arbitration sucessful, Address as slave status flag Cleared,
        //Address zero status flag cleared, Last received bit is 0
    rIICSTAT      = 0xf0;      
    
    //Clearing the pending bit isn't needed because the pending bit has been cleared.
    while(iicDataCount!=-1)
       Run_IicPoll();
 
iicMode = POLLACK;
    while(1)
    {
   rIICDS     = slvAddr;
        iicStatus = 0x100;                 //To check if _iicStatus is changed  
        rIICSTAT   = 0xf0;           //Master Tx, Start, Output Enable, Sucessful, Cleared, Cleared, 0
        rIICCON    = 0xe0;//0xaf;     //Resumes IIC operation. //hzh
        while(iicStatus==0x100)  
            Run_IicPoll();
              
        if(!(iicStatus & 0x1))
            break;                      //When ACK is received
    }
    rIICSTAT = 0xd0;                     //Master Tx condition, Stop(Write), Output Enable
    rIICCON  = 0xe0;//0xaf;              //Resumes IIC operation.  //hzh
    Delay(1);                           //Wait until stop condtion is in effect.
      //Write is completed.
}


void Rd24C02(U32 slvAddr,U32 addr,U8 *data)
{
    iicMode      = SETRDADDR;
    iicPt        = 0;
    iicData[0]   = (U8)addr;
    iicDataCount = 1;
 
    rIICDS   = slvAddr;
    rIICSTAT = 0xf0;                    //MasTx,Start 

  //Clearing the pending bit isn't needed because the pending bit has been cleared.
    while(iicDataCount!=-1)
        Run_IicPoll();
 
    iicMode      = RDDATA;
    iicPt        = 0;
    iicDataCount = 1;
    
    rIICDS   = slvAddr;
    rIICSTAT = 0xb0;                    //Master Rx,Start
    rIICCON  = 0xe0;//0xaf;              //Resumes IIC operation.  
    while(iicDataCount!=-1)
        Run_IicPoll();
 
    *data = iicData[1];
}


void Run_IicPoll(void)
{
    if(rIICCON & 0x10)                  //Tx/Rx Interrupt Enable
       IicPoll();
}

      
void IicPoll(void)
{
    U32 iicSt,i;
    iicSt = rIICSTAT; 
    if(iicSt & 0x8){};                   //When bus arbitration is failed. 总线仲裁失败
    if(iicSt & 0x4){};                    //When a slave address is matched with IICADD
    if(iicSt & 0x2){};                   //When a slave address is 0000000b
    if(iicSt & 0x1){} ;                  //When ACK isn't received
 
    switch(iicMode)
    {
    case POLLACK:
        iicStatus = iicSt;
        break;
       
    case RDDATA:
        if((iicDataCount--)==0)
        {
            iicData[iicPt++] = rIICDS;
        
            rIICSTAT = 0x90;           //Stop MasRx condition 
            rIICCON  = 0xc0;     
            Delay(1);                   //Wait until stop condtion is in effect. 
                                      
                                      
            break;    
        }      
        iicData[iicPt++] = rIICDS;
                    //The last data has to be read with no ack.
 if((iicDataCount)==0)
            rIICCON = 0x60;//0x2f;           
    else 
            rIICCON = 0xe0;//0xaf;     
        break;
                  
      case SETRDADDR:
          if((iicDataCount--)==0)
          {
              break;                       
          }
          rIICDS = iicData[iicPt++];
  for(i=0;i<10;i++);          
            rIICCON = 0xc0;              
            break;
            default:
            break;      
    }
}

void Delay(int x) 
 {
  int k,j;
  while(x)
  {
   for(k=0;k<=0xff;k++)
    for(j=0;j<=0xff;j++);
    x--;
  }


关键字:IIC实验 引用地址:2440下的IIC实验

上一篇:2440裸机篇之4 RTC实时时钟
下一篇:ARM开发步步深入之NandFlash 4KB突围

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

ARM串口(UART)的使用 (S3C2440)
UART概述 通用异步收发器简称UART(Universal Asynchronous Receiver and Transmitter) 工作方式为:串行、全双工。 只需3根线:TXD(发送数据)、RXD(接收数据)、GND。 数据传输流程: 原来是高电平(空闲状态) 发送方拉低电平,保持1bit时间,为起始位。 接收方检测到起始位,然后通信双方按照波特率发送和接收5-8位数据。 若使用校验功能,则发送完数据位后还要接着发送奇偶校验位。 最后,发送停止位。 S3C2440的UART的特性 3个独立异步串行I/O端口,每个都可以是基于中断或基 于 DMA 模式的操作。 UART 通过使用系统时钟可以支持最高 115.2
[单片机]
ARM串口(UART)的使用 (S3C<font color='red'>2440</font>)
基于嵌入式ARM9 S3C2440A 的USB设计与实现
引 言 USB(Universal Serial Bus)是通用串行总线的缩写,因其具有方便易用,动态分配带宽,容错性优越和高性价比等特点,现已成为计算机的主流接口。 随着嵌入式系统的广泛应用,各种小型终端需要开发出与外界联系的USB接口。目前,常用的技术有两种。基于单片机的USB接口,特点是需要外置芯片,电路复杂,留下的 CPU资源不多;基于ARM的USB接口,特点是资源丰富,但ARM系列产品较多,如果选型不当,还需要搭接较多的外围电路,且不能很好地发挥CPU性能。 该设计采用三星公司ARM9核的S3C2440A芯片作为CPU,因为该芯片内部集成了控制USB的所有部件,外围电路简单,易于实现。 1 S3C2440
[单片机]
基于嵌入式ARM9 S3C<font color='red'>2440</font>A 的USB设计与实现
u-boot1.1.6在s3c2440上移植
我用的2440开发板,取名为TX2440。 第一步:U-Boot -1.1.6需要交叉编译工3.3.2,首先安装arm-linux-gcc-3.3.2.tar.bz2。 第二步:将U-Boot-1.1.6放入smb服务器,在linux下解压。 (1)到U-boot-1.1.6目录下:cd u-boot-1.1.6 修改cpu/arm920t下的config.mk文件,将其中的-msoft-float注释掉: vi cpu/arm920t/config.mk #-msoft-float(意思是不使用软浮点进行编译。我们使用 的还是硬浮点) (2)修改U-boot-1.1.6目录下Makefile: 在smdk2410_config
[单片机]
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
我们实现了一个虚拟网卡驱动程序,现在我们针对真实的网卡芯片DM9000C,编写移植DM9000C网卡驱动程序。 一、移植分析 协议类的驱动,我们的主要工作往往是将现有的驱动和我们的硬件所匹配起来。协议类的函数往往已经成型不需要我们去修改和编写。比如发包函数:hard_start_xmit函数和netif_rx上报函数都不需要我们编写。网络驱动是针对很多硬件编写出来的,我们使用的是什么硬件CPU,比如ARM9,以及我们使用的系统版本。我们只需要修改驱动,告诉驱动现在的硬件情况是怎么样的,基地址是多少,中断引脚是哪个、设置下内存管理器以满足时序等等。这也是网络驱动移植的简单之处。 (1)DM9000C 一般一款网卡芯片,出
[单片机]
11-S3C<font color='red'>2440</font>驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
mini2440也即S3C2440地址分配问题
写这篇文章完全是回答一个网友的问题,因为我之前也是对这里不理解,现在简单说一下。源引问题“mini2440的地址到底是怎么分配的呢?内部rom ram 外部的ram和rom分别占用的地址是多少啊,我从板子上看到有3个k4561632N芯片还有一个S29AL016J70TF102.但是看了相关的电路图也不知道他的地址是怎么分配的” 你问的是mini2440的地址怎么分配。我只能再细节一下你的问题,mini2440处理器的地址怎么分配。mini2440的处理器是S3C2440,理论上,S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间
[单片机]
mini<font color='red'>2440</font>也即S3C<font color='red'>2440</font>地址分配问题
linux2.6.32.2 mini2440平台移植-- ADC 驱动移植
1.2.1 关于 S3C2440 的 ADC 和触摸屏接口 Linux-2.6.32.2 内核并没有提供支持 S3C2440 的 ADC 驱动程序,因此我们自行设计了一个,这个驱动比较简单,属于字符设备,。在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D 转换器,见S3C2440芯片手册第 16 章节,如图。 1.2.2 在内核中添加 ADC 驱动 在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D 转换器,因此,ADC 驱动和触摸屏驱动若想共存,就必须解决共享 A/D 转换器 资源这个问 题,因此在 ADC 驱动程序中声明了一个全局的 ADC_LOCK 信号量。 (1)将
[单片机]
linux2.6.32.2 mini<font color='red'>2440</font>平台移植-- ADC 驱动移植
uboot-2011.12移植到S3C2440(四序)——SDRAM分析
SDRAM(Synchronous Dynamic Random Access Memory,同步动态随机存储器)也就是通常所说的内存。内存的工作原理、控制时序、及相关控制器的配置方法一直是嵌入式系统学习、开发过程中的一个难点。我们从其硬件的角度来分析其原理,然后再引出SDRAM的驱动编写过程。 内存是代码的执行空间,以PC机为例,程序是以文件的形式保存在硬盘里面的,程序在运行之前先由操作系统装载入内存中,由于内存是RAM(随机访问存储器),可以通过地址去定位一个字节的数据,CPU在执行程序时将PC的值设置为程序在内存中的开始地址, CPU会依次的从内存里取址,译码,执行,在内存没有被初始化之前,内存好比是未建好的房子,是不能
[单片机]
uboot-2011.12移植到S3C<font color='red'>2440</font>(四序)——SDRAM分析
linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植
1.7.1 把 UART2 改为普通串口驱动 S3C2440 芯片具有 3 个串口:UART0,1,2,我们下载的 Linux-2.6.32.2 已经具备完善的 UART0,1 的驱动,但对UART2 却用作了红外通讯(Irda),因此我们需要把 UART2 驱动稍微调整一下,以便作为普通串口来用。 先看看 S3C2440 串口部分寄存器的说明,如下图 接下来我们修改内核中关于 UART2 的配置,打开 mach-mini2440.c 文件,找到,如下红色代码为修改后的: static struct s3c2410_uartcfg mini2440_uartcfgs __initdata = { = {
[单片机]
linux2.6.32.2 mini<font color='red'>2440</font>平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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