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);<