S3C2440之IIC裸机驱动
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点:
1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主设备,启动 之后
2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的
3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不死才怪呢。。。。所以数据手册中的NOTE部分也是特别重要的
4.在真正对AT24C02A进行读取数据时,在发送带有读命令的从设备地址后,AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以一定要把该字节读取后抛弃,因为它不是我们所要读取的信息。
5.下面是核心代码:
#include "def.h"
#include "2440addr.h"
#include "I2C.h"
#include "uart.h"
extern void Delay(int time);
int flag; //用于标识是否收到应答信号,改标识在终端处理程序中被清0
void Test_Iic(void)
{
unsigned int i,j,save_E,save_PE;
static U8 data[256];
uart_printf("\nIIC Test(Interrupt) using AT24C02\n");
save_E = rGPECON;
save_PE = rGPEUP;
rGPEUP |= 0xc000; //Pull-up disable
rGPECON |= 0xa00000; //GPE15:IICSDA , GPE14:IICSCL
pISR_IIC = (unsigned)IicInt;
rINTMSK &= ~(BIT_IIC);
//Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
// If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz
rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
rIICADD = 0x10; //2440 slave address = [7:1]
rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx)
rIICLC = (1<<2)|(1); // Filter enable, 15 clocks SDA output delay added by junon
uart_printf("Write test data into AT24C02\n");
for(i=0;i<256;i++)
{ Wr24C080(0xa0,(U8)i,i);
Delay(1); //注意这个延时不能少,否则出现有些数据无法写入的问题
}
for(i=0;i<256;i++)
data[0] = 0;
uart_printf("Read test data from AT24C02\n");
for(i=0;i<256;i++)
Rd24C080(0xa0,(U8)i,&(data[i]));
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
uart_printf("%2x ",data[i*16+j]);
uart_printf("\n");
}
rINTMSK |= BIT_IIC;
rGPEUP = save_PE;
rGPECON = save_E;
}
void Wr24C080(U32 slvAddr, U32 addr, U8 data)
{
flag=1; //应答标志
rIICDS = slvAddr;
rIICSTAT = 0xf0; // 主设备,启动
rIICCON &= ~0x10; //清中断标志 ,特别注意这条语句的位置,不能放到上条的前面
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
flag =1 ; //readly to translate addr
rIICDS = addr;
rIICCON &= ~0x10; //清中断标志
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
flag =1 ; //readly to translate data
rIICDS = data;
rIICCON &= ~0x10; //清中断标志
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
rIICSTAT = 0xd0; //Stop MasTx condition
rIICCON = 0xaf; //Resumes IIC operation.
Delay(1);
}
void Rd24C080(U32 slvAddr, U32 addr, U8 *data)
{
unsigned char temp;
flag=1; //应答标志
rIICDS = slvAddr;
rIICSTAT = 0xf0; // 主设备发送模式用来发送slvAddr和addr,,启动
rIICCON &= ~0x10; //清中断标志
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
flag =1 ; //readly to translate addr
rIICDS = addr;
rIICCON &= ~0x10; //清中断标志
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
flag=1;
rIICDS = slvAddr;
rIICSTAT = 0xb0; // 主设备接收模式用来接收数据,启动
rIICCON &= ~0x10; //清中断标志
while(flag == 1) //当发送从地址完成之后会收到ACK信号,在中断处理函数中将该标志置为0
Delay(1);
//注意:读取下面这个字节必须进行,因为在发送带有读命令的从设备地址后,
//AT24C02A会再返回一个从设备地址信息或从设备内存地址信息作为应答,所以一定要把该字节读取后抛弃,因为它不是我们所要读取的信息;
flag =1 ; //readly to translate addr
temp = rIICDS; // 抛弃第一自己
rIICCON &= ~0x10; //清中断标志
while(flag)
Delay(1);
rIICCON = 0x2f; //Resumes IIC operation with NOACK.
*data = rIICDS;
Delay(1);
rIICSTAT = 0x90; //Stop MasTx condition
rIICCON = 0xaf; //Resumes IIC operation.
Delay(1);
}
//-------------------------------------------------------------------------
void __irq IicInt(void)
{
rSRCPND = BIT_IIC; //Clear pending bit
rINTPND = BIT_IIC;
flag = 0;
}
原文链接:http://www.linuxidc.com/Linux/2011-06/37583p4.htm
S3C2440之IIC裸机驱动相关推荐
- Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析
关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 -- IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...
- Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...
转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...
- ccs 移植创建新工程_LiteOS裸机驱动移植05 | E53_SF1智慧消防扩展板驱动及使用
(小熊派IoT开发套件全部教程 ↑点击启阅↑) ▷01 | 物联网一站式开发工具 IoT-Studio ▷02 | Hello World ▷03 | 任务管理 ▷04 | 信号量(任务同步) ▷ ...
- Exynos4412 IIC总线驱动开发(二)—— IIC 驱动开发
前面在Exynos4412 IIC总线驱动开发(一)-- IIC 基础概念及驱动架构分析 中学习了IIC驱动的架构,下面进入我们的驱动开发过程 首先看一张代码层次图,有助于我们的理解 上面这些代码的展 ...
- 【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用
1. LCD裸机驱动 小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信. 如果你对裸机玩转LCD屏幕还不熟悉,请先阅 ...
- 基于s3c2440的12864液晶驱动
基于s3c2440的12864液晶驱动 12864是12864点阵液晶模块的点阵数简称,业界约定俗成的简称. 一.液晶显示模块概述 12864A-1 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 ...
- linux iic 设备驱动,linux IIC设备驱动.doc
linux IIC设备驱动 //---------------IIC的linux驱动------------------#include #include #include #include #inc ...
- 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植
摘 要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...
- X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代
目录 点击这里查看所有博文 本系列博客,理论上适用于合宙的Air202.Air268.Air720x.Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持). 先不管支不支 ...
最新文章
- [C#泛型系列文章]
- 多项式加法 java 链表_多项式加法,用单链表实现。
- python 虚拟环境原理_Python 虚拟环境
- 8086地址传送指令LEA,LDS,LES
- c+gui语言可视化编程
- Citrix XenDesktop中VDA无法注册到DDC案例分享(一)
- vue项目html,Vue项目接口.html
- sqlserver2008R2下载安装教程
- Python_爬虫_urllib解析库
- 共享淘宝客app与独立淘宝客app哪个好?
- 4S店的大数据营销实战案例分析
- 新派重型混音教程|看了几年的混音教程,自己还是没有进步。(思想篇+技术篇+扫盲5个误区)|MZD Studios
- Animate.css动画库的使用操作
- 互联网日报 | 虎牙与斗鱼官宣合并;国内第四大运营商中国广电成立;拍拍贷完成存量业务清退...
- “我36岁了,还得对28岁的领导赔笑脸”:中年人的职场,心酸自知
- 为什么有时候我们在测试ESP32或ESP8266模块使用 QOUT/QIO 下载固件,程序无法正常运行? (DIO/DOUT 正常)另外ESP32功耗怎么校验?
- html clear 清楚li,CSS清楚浮动clear:both
- WIN7远程桌面连接方法!远程控制教程!XP远程桌面连接教程!如何设置远程桌面连接?远程桌面连接设置!
- windows8 下载
- 五步实现“中国制造”精益物流系统
热门文章
- 【跨境电商】5个最佳WordPress插件推荐
- 清华大学计算机学院考研参考书目,2020清华大学计算机考研参考书目及复试线...
- win10系统nfs服务器搭建
- 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1
- PDF合并在电脑上怎样实现?PDF合并的方法有哪些?
- DPU芯片头部企业云豹智能加入龙蜥社区,共同推动新一代数据中心基础设施蓬勃发展
- golang 时间missing Location in call to Date
- Python学习笔记4——csv/excel文件读写保存
- 计算机网络打不开怎么办,网页无法打开,详细教您有网络但是打不开网页怎么办?...
- Django 实现搜索结果分页(筛选结果分页),以及优雅添加多个筛选条件