JZ2440 裸机驱动 第12章 I2C接口
3 I2C总线的数据传输格式

行号
24行/*
25行 *I2C初始化
26行 */
27行 void i2c_init(void)
28行 {
29行 GPEUP |= 0xc000; //禁止内部上拉
30行 GPECON |= 0xa0000000; //选择引脚功能,GPE15:IICSDA,GPE14:IICSCL
31行
32行 INTMSK &= ~(BIT_IIC);
33行
34行 /*bit[7] = 1,使能ACK
35行 *bit[6] = 0,IICCLK = PCLK/16
36行 *bit[5] = 1,使能中断
37行 *bit[3:0] = 0xf,Tx clock = IICCLK/16
38行 *PCLK = 50MHz、IICCLK = 3.125MHz,Tx Clock = 0.195MHz
39行 */
40行 IICCON = ( << ) | ( << ) | ( << ) | (0xf); //0xaf
41行
42行 IICADD = 0x10; //S3C24xx slave address = [7:1]
43行 IICSTAT = 0x10; //I2C串行输出使能(Rx/Tx)
44行 }
45行
i2c.c->i2c_init()
行号
46行 /*
47行 *主机发送
48行 *slvAddr:从机地址,buf:数据存放的缓冲区,len:数据长度
49行 */
50行 void i2c_write(unsigned int slvAddr, unsigned char *buf, int len)
51行 {
52行 g_tS3C24xx_I2C.Mode = WRDATA; //写操作
53行 g_tS3C24xx_I2C.Pt = ; //索引值初始化为0
54行 g_tS3C24xx_I2C.pDATA = buf; //保存缓冲区地址
55行 g_tS3C24xx_I2C.DataCount = len; //传输长度
56行
57行 IICDS = slvAddr;
58行 IICSTAT = 0xf0; //主机发送、启动
59行
60行 /*等待直至数据传输完毕*/
61行 while(g_tS3C24xx_I2C.DataCount != -);
62行 }
63行
i2c.c->i2c_write()
i2c_read函数的实现与i2c_write类似,代码如下:
行号
64行 /*
65行 *主机接收
66行 *slvAddr:从机地址,buf:数据存放的缓冲区,len:数据长度
67行 */
68行 void i2c_read(unsigned int alvAddr, unsigned char *buf, int len)
69行 {
70行 g_tS3C24xx_I2C.Mode = RDDATA; //读操作
71行 g_tS3C24xx_I2C.Pt = -; //索引值初始化为-1,表示第一个中断时不接收数据(地址中断)
72行 g_tS3C24xx_I2C.pData = buf; //保存缓冲区地址
73行 g_tS3C24xx_I2C.DataCount = len; //传输长度
74行
75行 IICDS = slvAddr;
76行 IICSTAT = 0xb0; //主机接收,启动
77行
78行 /*等待直至数据传输完毕*/
79行 while(g_tS3C24xx_I2C.DataCount != -);
80行 }
81行
i2c.c->i2c_read()
I2C操作的主体在中断服务程序,它分为3部分:首先在SRCPND、INTPND中清除中
行号
82行 /*
83行 *I2C中断服务程序
84行 *根据剩余的数据长度选择继续传输或者结束
85行 */
86行 void I2CInitHandle(void)
87行 {
88行 unsigned int iicSt, i;
89行
90行 //清中断
91行 SRCPND = BIT_IIC;
92行 INTPND = BIT_IIC;
93行
94行 iicSt = IICSTAT;
95行
96行 if(iicSt & 0x8){printf("Bus arbitration failed\n\r");} //仲裁失败
i2c.c->I2CInitHandle()
行号
98行 switch(g_tS3C24xx_I2C.Mode)
99行 {
100行 case WRDATA:
101行 {
102行 if((g_tS3C24xx_I2C.DataCount--) == )
103行 {
104行 //下面两行用于恢复I2C操作,发出P信号
105行 IICSTAT = 0xd0;
106行 IICCON = 0xaf;
107行 Delay(); //等待一段时间以便P信号已经发出
108行 break;
109行 }
110行
111行 IICDS = g_tS3C24xx_I2C.pData[g_tS3C24xx_I2C.Pt++];
112行
113行 //将数据写入IICDS后,需要一段时间才能出现在SDA线上
114行 for(i = ; i < ; i++);
115行
116行 IICCON = 0xaf; //恢复I2C传输
117行 break;
118行 }
119行
i2c.c->I2CInitHandle()->switch()->case WRDATA
行号
120行 case RDDATA:
121行 {
122行 if(g_tS3C24xx_I2C.Pt == -)
123行 {
124行 //这次中断时在发送I2C设备地址后发生的,没有数据
125行 //只接收一个数据时,不要发出ACK信号
126行 g_tS3C24xx_I2C.Pt = ;
127行 if(g_tS3C24xx_I2C.DataCount == )
128行 IICCON = 0x2f; //恢复I2C传输,开始接收数据,接收到数据时不发出ACK
129行 else
130行 IICCON = 0xaf; //恢复I2C传输,开始接收数据
131行 break;
132行 }
133行
134行 if((g_tS3C24xx_I2C.DataCount--) == )
135行 {
136行 g_tS3C24xx_I2C.pData[g_tS3C24xx_I2C.Pt++] = IICDS;
137行
138行 //下面两行恢复I2C操作,发出P信号
139行 IICSTAT = 0x90;
140行 IICCON = 0xaf;
141行 Delay(); //等待一段时间以便P信号已经发出
142行 break;
143行 }
144行
145行 g_tS3C24xx_I2C.pData[g_tS3C24xx_I2C.Pt++] = IICDS;
146行
147行 //接收最后一个数据时,不要发出ACK信号
148行 if(g_tS3C24xx_I2C.DataCount == )
149行 IICCON = 0x2f; //恢复I2C传输,接收到下一个数据时无ACK
150行 else
151行 IICCON = 0xaf; //恢复I2C传输,接收到下一个数据时发出ACK
152行 break;
153行 }
case RDDATA
m4lt11_set_datetime函数代码如下:
行号
29行 /*
30行 *写m4lt11,设置日期和时间
31行 */
32行 int m4lt11_set_datetime(struct rtc_time *dt)
33行 {
34行 unsigned char leap_yr;
35行 struct{
36行 unsigned char addr;
37行 struct rtc_registers rtc;
38行 }__attribute__ ((packed)) addr_and_regs;
... .../*设置rtc结构,即根据传入的参数构造各寄存器的值*/
76行 i2c_write(0xD0, (unsigned char *)&addr_and_regs, sizeof(addr_and_regs));
77行
78行 return ;
79行 }
m4lt11.c->m4lt11_set_datetime()
行号
81行 /*
82行 *读取m4lt11,获取日期与时间
83行 */
84行 int m4lt11_get_datetime(struct rtc_time *dt)
85行 {
86行 unsigned char addr[] = {};
87行 struct rtc_registers rtc;
88行
89行 memset(&rtc, , sizeof(rtc));
90行
91行 i2c_write(0xD0, addr, );
92行 i2c_read(0xD0, (unsigned char *)&rtc, sizeof(rtc));
93行
... .../*根据读出的各寄存器的值,设置dr结构体*/
110行 return ;
111行 }
m4lt11.c->m4lt11_get_datetime()
SECTIONS{
. = 0x00000000;
.init : AT(){head.o init.o nand.o}
. = 0x30000000;
.text : AT(){ *(.text)}
.rodata ALIGN() : AT((LOADADDR(.text)+SIZEOF(.text)+)&~(0x03)){*(.rodata*)}
.data ALIGN() :AT((LOADADDR(.rodata)+SIZEOF(.rodata)+)&~(0x03)){*(.data)}
__bss_start = .;
.bss ALIGN() :{ *(.bss) *(COMMON)}
__bss_end = .;
}
i2c.lds
#### RTC Menu ####
Data format: 'year.month.day w hour:min:sec', 'w' is week day
eg:.. ::
[S] Set the RTC
[R] Read the RTC
Enter your selection:
Enter data&time:
*** Now is: .. :: ***
JZ2440 裸机驱动 第12章 I2C接口的更多相关文章
- JZ2440 裸机驱动 第5章 GPIO接口
本章目标: 掌握嵌入式开发的步骤:编程.编译.烧写程序.运行 通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍 S3C2440A有130个多功能输入/输出口引脚 ...
- JZ2440 裸机驱动 第14章 ADC和触摸屏接口
本章目标: 了解S3C2410/S3C2440和触摸屏的结构: 了解电阻触摸屏的工作原理和等效电路图: 了解S3C2410/S3C2440触摸屏控制器的多种工作模式: ...
- JZ2440 裸机驱动 第13章 LCD控制器(1)
本章目标 了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...
- JZ2440 裸机驱动 第10章 系统时钟和定时器
本章目标 了解S3C2410/S3C2440的时钟体系结构 掌握通过设置MPLL改变系统时钟的方法 掌握在不同的频率下设置存储控制器的方法 掌握PWM定时器的用法 ...
- JZ2440 裸机驱动 第6章 存储控制器
本章目标: 了解S3C2410/S3C2440地址空间的布局 掌握如何通过总线形式访问扩展的外设,比如内存.NOR Flash.网卡等 ························ ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- JZ2440 裸机驱动 第13章 LCD控制器(2)
13.2 TFT LCD显示实例 13.2.1 程序设计 本实例的目的是从串口输出一个菜单,从中选择各种方法进行测试,比如画线. 画圆.显示单色.使用调色板等. 13.2.2代码详解 ...
- JZ2440 裸机驱动 第11章 通用异步收发器UART
本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明 UART用于传输串行数据: ...
- JZ2440 裸机驱动 第7章 内存管理单元MMU
本章目标: 了解虚拟地址和物理地址的关系: 掌握如何通过设置MMU来控制虚拟地址到物理地址的转化: 了解MMU的内存访问权限机制: 了解TLB.Cache.Write ...
随机推荐
- forget word qz_c
1● circum s ək ʌm 圆周 环绕 周围 2● co 元音前 共同 3● col 4● cor 铺音前 共同 5● com 6● con 共同
- hadoop kafka install (6)
reference: http://kafka.apache.org/quickstart http://dblab.xmu.edu.cn/blog/1096-2/ hadoop@iZuf68496 ...
- HDU 4091 Zombie’s Treasure Chest 分析 难度:1
Zombie’s Treasure Chest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- Oracle 12c新特性(For DBA)
一: Multitenant Architecture (12.1.0.1) 多租户架构是Oracle 12c(12.1)的新增重磅特性,内建的多分租(Multi-tenancy),一个容器 ...
- 【令人振奋】【转】微软潘正磊谈DevOps、Visual Studio 2013新功能、.NET未来
日前,微软开发平台事业部全球资深副总裁潘正磊(Julia Liuson)从美国总部回到北京参加TechEd2013,在大会现场,潘正磊接受了CSDN的访谈,对于微软研发团队如何运用DevOps模式.对 ...
- 调用Nt函数内核模式切换问题
很久不写博客了,笔记大多记在电脑上在,以后整理好了再搬运上来吧. 今天记一下“进程内存管理器”这个小程序上遇到的一个问题——内核模式调用Nt*函数. 使用的是内核中的NtQueryVirtualMem ...
- 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...
- SharePoint Word Service-PowerShell
1. 配置转换进程 Set-SPWordConversionServiceApplication –Identity "Word Automation Services" –Act ...
- 使用adb命令对手机进行截屏保存到电脑,SDCard
adb shell /system/bin/screencap -p /sdcard/screenshot.png(保存到SDCard) adb pull /sdcard/screenshot.png ...
- Oracle中varchar2类型字段长度限制使用问题
为纪念中华人民共和国建军90周年,特此一篇,以此纪念,我军威武!!! 一.问题背景 项目中商品发布,却没有保存成功. 二.问题定位 初步判断向数据库中保存时出现了错误,查看日志文件,由于日志文件过大就 ...