s3c2440 iic eeprom

发布者:JoyfulSunflower最新更新时间:2022-10-08 关键字:s3c2440  iic  eeprom 手机看文章 扫描二维码
随时随地手机看文章

1、使用2440 iic 模块控制

#include "2440addr.h"

#include "uart.h"


volatile int ackFlag = 0;


void delay()

{

int i,j;

for(i = 0; i < 500;i++)

for(j = 0; j < 500; j++)

;

}


/***********************************************

Function  name  :   Iic_ISR

Description     :   iic 中断处理函数

Input parameter :   none

Return          :   none

Others     :                                        

*************************************************/

static void __irq Iic_ISR()

{

//清除中断

rSRCPND |= (1 << 27);

rINTPND |= (1 << 27);

ackFlag = 1;

}




/***********************************************

Function  name  :   iic_init

Description     :   iic 通信初始化

Input parameter :   none

Return          :   none

Others     :                                        

*************************************************/

void iic_init(void)

{

//配置GPE1415 为 IICSCL 、IICSDA、不使能拉高电阻(GPE1415没有对应的位)

rGPECON &= ~(0xf << 28);

rGPECON |= (0x2 << 30) | (0x2 << 28);

//清除中断

rSRCPND |= (1 << 27);

rINTPND |= (1 << 27);

//开启iic中断

rINTMSK &= ~(1 << 27);

//设置中断处理函数

pISR_IIC = (unsigned)Iic_ISR;

//配置IICCON寄存器:使能ACK,时钟源选择fPCLK /512

//(从eeprom手册看出,其最大的传输频率为100kHZ)

//使能中断,发送时钟值为0xf。

//Tx clock = IICCLK/(IICCON[3:0]+1)=50000000/512=97kHz

rIICCON = (1<<7)|(1<<6)|(1<<5);

//设置CPU的从设备地址(未使用)

rIICADD = 0x10;

//IIC-bus data output enable

rIICSTAT |= (1<<4);


}


/***********************************************

Function  name  :   iic_Tx

Description     :   iic 发送数据

Input parameter :   buffer 要发送的数据

size:数据大小

Return          :   none

Others     :                                        

*************************************************/

void iic_Tx(unsigned char devAddr,unsigned char wordAddr,char buffer[],int size)

{

int i = 0,j = 0;

ackFlag = 0;

//写从设备地址到IICDS寄存器

rIICDS = devAddr;

//配置为主发送模式

//写0XF0到IICSTAT(主发送模式,并开始)

rIICSTAT = 0xf0;

for(i = 0; i < 100; i++);

//清除挂起位

rIICCON &= ~(1<<4);

//等待ack中断响应

//while(!ackFlag);

//注意:这里等待挂起可以单独判断pending,但不能单独判断ack,防止数据丢失

while(!ackFlag)

delay();

ackFlag = 0;

//写起始地址到IICDS寄存器

rIICDS = wordAddr;

for(i = 0; i < 100; i++);

//清除挂起位

rIICCON &= ~(1<<4);

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

//向IICDS写入发送数据直到发送结束

for(j = 0; j < size; j++)

{

//写入新数据

rIICDS = buffer[j];

for(i = 0; i < 100; i++);

//清除挂起位

rIICCON &= ~(1<<4);

//等待ack中断

while(!ackFlag)

delay();

ackFlag = 0;

}

//发送结束,写0XD0到 IICSTAT

rIICSTAT = 0xd0;

rIICCON = 0xe0;

//等待停止条件生效

delay();

}




/***********************************************

Function  name  :   iic_Rx

Description     :   iic 接收数据

Input parameter :   buffer 接收buffer

Return          :   i: 接收到的数据大小

Others     :                                        

*************************************************/

int iic_Rx(unsigned char devAddr,unsigned char wordAddr,char * buffer,int size)

{

char ch;

int i = 0,j = 0;

ackFlag = 0;

//写从设备地址到IICDS寄存器

rIICDS = devAddr;

for(i = 0; i < 100; i++);

//配置为主发送模式

//写0XF0到IICSTAT(主发送模式,并开始)

rIICSTAT = 0xf0;

//清除挂起位

rIICCON &= ~0x10;

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

//写起始地址到IICDS寄存器

rIICDS = wordAddr;

for(i = 0; i < 100; i++);

//清除挂起位

rIICCON &= ~0x10;

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

//写从设备地址到IICDS寄存器

rIICDS = devAddr;

for(i = 0; i < 100; i++);

//写0XB0到IICSTAT(主接收模式,并开始)

rIICSTAT = 0xb0;

//清除挂起位

rIICCON &= ~0x10;

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

//从IICDS读取第一个字节舍弃

ch = rIICDS;

//清除挂起位

rIICCON &= ~0x10;

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

//从IICDS读取数据直到接收结束

for(j = 0; j < size; j++)

{

if(j == size-1)

{

rIICCON &= ~0x80;

}

//从IICDS读取数据

buffer[j] = rIICDS;

for(i=0;i<100;i++);

//清除挂起位

rIICCON &= ~0x10;

//等待ack中断响应

while(!ackFlag)

delay();

ackFlag = 0;

}

//接收结束,写0X90到 IICSTAT

rIICSTAT = 0x90;

rIICCON = 0xe0;

//等待停止条件生效

delay();

return j;

}


/***********************************************

Function  name  :   iic_test

Description     :   iic 测试

Input parameter :   none

Return          :   none

Others     :                                        

*************************************************/

int iic_test(void)

{

iic_init();

int i = 998;

int j = 0;

iic_Tx(0xa0,0,(char*)&i,4);

iic_Rx(0xa0,0,(char*)&j,4);

uart_printf("nj = %dn",j);

}



2、使用 io 模拟

/******************

iic.h

*******************/

#ifndef _IIC_H_

#define  _IIC_H_

#include "def.h"


void iic_init(void);


#define  AT24C08_ADDRDRESS    0xa0


#define  true  1

#define  false   0



#define PAGE1   0xa0

#define PAGE2   0xa2

#define PAGE3   0xa4

#define PAGE4   0xa6


#define  IIC_CLOCK_HIGH           rGPEDAT |= (1<<14)

#define  IIC_CLOCK_LOW            rGPEDAT &= ~(1<<14)


#define  IIC_DATA_HIGH            rGPEDAT |= (1<<15)

#define  IIC_DATA_LOW             rGPEDAT &= ~(1<<15)


#define  SET_IIC_DATA_INPUT       rGPECON &= ~(3<<30)

#define  SET_IIC_DATA_OUTPUT      rGPECON |= (1<<30)



U8  i2c_write(U8  device_address, U8  memory_address , U8 data);


U8  i2c_read(U8  device_address,  U8  memory_address, U8 *data);


U8  i2c_page_read(U8  device_address,  U8  memory_address, U8 *destination,U32 size);


U8  i2c_page_write(U8  device_address, U8 memory_address , U8 *source,U32 size);



U8  i2c_largepage_write(U8  device_address, U8 memory_address , U8 *source,U32 size);



void i2c_test(void);


#endif



/*****************************

iic.c

*****************************/


#include "2440addr.h"

#include "def.h"

#include "uart.h"

#include "iic.h"

//#include "timer.h"


#define   DELAY_DECIMUS_MS  100

extern void Delay_MS( unsigned int time);


void delayus( U32 time)

{

U32 i,j;

for ( i=0; i {

  for(j=0;j   {

  }

       }

      

}



void iic_init(void)

{

/* config  GPE14, GPE15 as output*/

rGPECON &=(~((3<<30)|(3<<28)));

rGPECON |=(1<<30)|(1<<28);

/* SDA,SCL 默认为高电平 */

rGPEDAT |= ((1<<15)|(1<<14));

rGPEUP |= ((1<<15)|(1<<14));

delayus(1);

}

/* start */

void i2c_start(void)

{


IIC_DATA_HIGH; 

delayus(1);

IIC_CLOCK_HIGH;

delayus(1);

IIC_DATA_LOW;   

delayus(1);

IIC_CLOCK_LOW;

}


void  i2c_stop(void)

{   

SET_IIC_DATA_OUTPUT;

delayus(1);

IIC_DATA_LOW;   

  delayus(1);  

IIC_CLOCK_HIGH;   

delayus(1);  

IIC_DATA_HIGH; 

  delayus(1);   

}


U8  check_ack(void)

{

/* ack */  

  U8  ret;


U8 ucErrTime=0; 

SET_IIC_DATA_INPUT;

delayus(1); 

IIC_CLOCK_HIGH; //negative edge clock data out of each device

  delayus(1);

while(rGPEDAT&(1<<15))

  {

  ucErrTime++;      //时间累加

ret = false;             

if(ucErrTime>250)                     //如果时间大于250

{

i2c_stop();                         //调用IIC停止子函数

return ret;                         //程序返回值0

}

       

  }

 

   ret = true;

   

IIC_CLOCK_LOW; 

delayus(1);  

SET_IIC_DATA_OUTPUT; 

delayus(1);

return ret;

}  


void send_no_ack(void)

{

  delayus(1);   

  IIC_CLOCK_LOW;  //positive edge clock data into eachEEPROM 

  delayus(1); 

  SET_IIC_DATA_OUTPUT;//发送数据时与上升沿同步

  IIC_DATA_HIGH;           /* 发送高电平no ack */

  delayus(2); 

  IIC_CLOCK_HIGH;

  delayus(1); 

      IIC_CLOCK_LOW;

  delayus(1);

}



void  data_write(U8 data)

{

  U8 i;

  SET_IIC_DATA_OUTPUT; 

  delayus(1);

      

  /* data transmit */    

  for (i = 0; i< 8; i++)

  {

 

  if(data&(1<<(7-i)))//发送数据时与上升沿同步

      {

            IIC_DATA_HIGH;

      }

      else

      {

          IIC_DATA_LOW;

      }  

       

      delayus(1);

      IIC_CLOCK_HIGH ;   

      delayus(1);  

  IIC_CLOCK_LOW ;

    delayus(1);

  }

  

   IIC_DATA_HIGH;

      delayus(1);

// UartPuts(" data write over!n");

[1] [2]
关键字:s3c2440  iic  eeprom 引用地址:s3c2440 iic eeprom

上一篇:s3c2440中断总结+按键中断
下一篇:s3c2440串口编程

推荐阅读最新更新时间:2024-11-18 16:29

基于Linux的温度传感器DS18B20驱动程序设计
  引言   传统的模拟温度测量抗干扰能力差,放大电路零点漂移大,导致测量值误差大,难以达到所需精度。在实际应用中,采用抗干扰能力强的数字温度传感器是解决上述问题的有效办法。   DS18B20是Dallas公司生产的数字温度传感器,具有体积小、适用电压宽、经济灵活的特点。它内部使用了onboard专利技术,全部传感元件及转换电路集成在一个形如三极管的集成电路内。DS18B20有电源线、地线及数据线3根引脚线,工作电压范围为3~5.5 V,支持单总线接口。   准确的温度测量是很多嵌入式系统中重要的一点。在Linux操作系统下使用数字温度传感器DS18B20,不仅可以得到高精度的温度测量值,而且硬件简单可靠。   1Linu
[单片机]
基于Linux的温度传感器DS18B20驱动程序设计
S3C2440-DMA
[单片机]
S3C2440 2440init.s分析第一篇(二)
;//2.根据工作频率设置pll ;这里介绍一下计算公式 ;//Fpllo=(m*Fin)/(p*2^s) ;//m=MDIV+8,p=PDIV+2,s=SDIV ;The proper range of P and M: 1 =P =62, 1 =M =248 ;Fpllo必须大于20Mhz小于66Mhz ;Fpllo*2^s必须小于170Mhz ;如下面的PLLCON设定中的M_DIV P_DIV S_DIV是取自option.h中 ;#elif (MCLK==40000000) ;#define PLL_M (0x48) ;#define PLL_P (0x3) ;#define PLL_S (0x2)
[单片机]
s3c2440 移值u-boot-2016.03 第3篇 支持Nor flash 识别
当选择,NOR flash 启用时,才可以访问 NOR FLASH 。 /common/board_r.c 364 line: initr_flash() flash_size = flash_init(); /drivers/mtd/cfi_flash.c 想要打开调试的话, 就定义这个 #define DEBUG flash_init() debug( JEDEC PROBE: ID %x %x %xn , info- manufacturer_id, info- device_id, info- device_id2); if (jedec_flash_match(info, info- start )) break; /d
[单片机]
<font color='red'>s3c2440</font> 移值u-boot-2016.03 第3篇 支持Nor flash 识别
s3c2440——按键中断
s3c2440的异常向量表: IRQ中断地址是0x18.所以,根据之前的异常处理方式,我们编写启动文件: 为什么需要lr减4,可以参考这篇文章: http://blog.csdn.net/zzsfqiuyigui/article/details/23334177 这是为了保证,当cpu正在执行某条指令时被中断打断,中断返回的时候,要继续执行这条被打断的指令,如果不减去4,cpu处理完中断之后,将会在被打断执行的这条指令的下一条指令开始执行(因为lr_irq保存的是下一条指令执行的地址),就会丢失掉这个被打断指令的执行,所以,保存中断处理完毕的返回地址很重要。 void handle_irq_c(void) {
[单片机]
s3c2440的UART用法
SPI、IIC和UART是最常用的三种串行总线,这三种总线在s3c2440中都被集成了。在这里我们主要介绍UART,另两个总线在后面的文章中给出。 UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)用于异步通信,可以实现全双工发送和接收。它不仅可以实现不同嵌入式系统之间的通信,还可以实现与PC之间的通信。 s3c2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。在这里,我们只给出非FIFO模式,即传输数据不利用FIFO缓存,一
[单片机]
s3c2440移植openharmony
s3c2440移植openharmony。OpenHarmony是开放原子开源基金会的一个孵化项目,OpenHarmony完全开源开放,OpenHarmony轻量和小型系统比较适合内存小的IOT设备。 OpenHarmony同时提供许多可选的系统组件,设备开发者能够按需配置。系统能够把这些能够选择的组件合成一个系列的系统能力让设备开发者更好的理解和开发。 想对OpenHarmony进行开发、编译、烧录、调测能够使用DevEco Device Tool。 现在的openharmony轻量和小型系统搭建系统环境Windows版本不支持在Windows平台编译,Hi3861除外,其它的只能在Ubuntu平台下编译。
[单片机]
arm920t中S3C2440、S3C2450和S3C6410的区别
  三星目前推出了S3C6400和S3C6410,都是基于ARM架构的,而且硬件管脚兼容,应该说大致的功能基本相同,比较明显的区别就是S3C6410带有2D/3D硬件加速   S3C2440其实是一个很不错的CPU,价格便宜、内部资源多、最主要的是国内很多人使用,相关的资料比较多。ARM920T内核, 400M主频,支持NAND FLASH、NORFLASH、SDRAM、支持STN/TFT LCD、4通道DMA、3通道UART、2通道SPI、IIC总线、IIS/AC97音频控制器、SD/MMC控制器、2通道USB HOST 1通道USB DEVICE、4通道PWM、8通道A/D转换、触摸屏控制器、RTC、CMOS摄像头、多功能
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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