s3c2440 IIC AT24C08

S3C2440 裸机IIC程序代码(基于AT24C08测试):

因为不能上传附件:源代码放在了资源页。点击下载

包括两种读写方式:中断非中断(其实原理相通,非中断也是通过检测IICCON bit4 以此来判断是否有中断产生,后面的中断、非中断处理函数一样)。

然后AT24C08读写方式又分两种:按页读写和单字节读写。

本节介绍中断方式读写:

S3C2440手册上主机收发方式:

1.Master/Transmitter Mode(主机发送模式)按照以下步骤初始化:

GPEUP  |= 0xc000;  //1100 0000 0000 0000  使用内部上拉
GPECON |= 0xa0000000; //关闭内部上拉,注意要有外部上拉电阻

INTMSK &=~ (BIT_IIC); //使能IIC中断
IICCON |= ((1<<7)|(0<<6)|(1<<5)|(0xf));//0xaf (0<<4)|(1<<0)); // 

//使能ACK  ,IICCLK=fPCLK/16,使能IIC收发中断,   Tx Clock =  IICCLK/8

//例:PCLK 50.7MHz, IICCLK=PCLK/16=3.17MHz, Tx Clock(发送时钟)=IICCLK/16=0.198MHz
IICADD |= 0x10; //10100**0 //2440 slave address=[7:1]=0x10 从机地址
IICSTAT = 0x10; //1101 0000  //IIC bus data output enable(Rx/Tx) IIC数据输出使能

2.主机发送数据,流程如下图:

         与IO模拟IIC总线操作有差别的地方在于,从机地址最后一字节不需要实现读写操作,直接将bit[7:1]从机地址,bit0=0即可。

IICDS = slvAddr ;   //从机地址末字节不需要自己添加
IICSTAT = 0xf0;//主机发送,启动

发送过程关键是检测是否有从机ACK中断产生,产生中断后,进入中断函数,然后清中断,将要发送数据写入IICDS,然后IICCON  = 0xaf恢复IIC操作,依次循环,实现一个字节一个字节的发送数据。到最后一个字节时,发送停止信号:IICSTAT = 0xd0

流程图如下:


主机发送流程图

3.主机接收,流程如下:

接收时需要先将AT24C08从机地址以及要读的地址发送给从机,所以读操作开始是两个字节的写操作,具体方法见主机写操作。

        然后是读操作:

IICSTAT = 0xb0;//1010 0000 主机接收,启动
IICCON = 0xaf;  //恢复IIC操作

然后等待接收中断,注意第一次中断是发送完地址产生的中断,读到的数据为0,无效。以后每来一次中断,读一次IICDS,读完恢复IIIC传输IICCON = 0xaf,依次循环,直到最后一个字节,发送IICCON = 0x2f;//恢复IIC传输,接收下一数据时无ACK,等到接收下一数据时,IICSTAT = 0x90;//发送P 停止信号,以此结束IIC读操作。



主机接收流程图


具体程序如下:排版可能有问题,把程序添加到附件,需要的同学可以下载下来,有问题的地方,请指出来,共同进步。

#include "s3c24xx.h"
#include "i2c.h"
#include "serial.h"
#include <stdio.h>

//#define BIT_IIC (1<<27)

#define WRDATA 1
#define RDDATA 2
#define SETADDR 3
#define POLLACK 4

typedef struct tI2C {
    unsigned char pData[18];   //pData[2];   // 数据缓冲区
      //******* 不可以直接定义成指针
    volatile int DataCount; /* 等待传输的数据长度 */
    volatile int Status;    /* 状态 */
    volatile int Mode;      /* 模式:读/写 */
    volatile int Pt;        /* pData中待传输数据的位置 */
}tS3C24xx_I2C, *ptS3C24xx_I2C;


tS3C24xx_I2C g_tS3C24xx_I2C;


void Test_Iic_Page(void){
static unsigned char data_write[256];
static unsigned char data[256];
static int i,j;


i2c_init();


printf("\r\nClean data in AT24C08!!!\n\r");
for(i=0;i<16;i++){
Wr24C08(0xa0,(unsigned char)(16*i),0);<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值