当前位置: 首页 > news >正文

网站设计网址wordpress排名主题

网站设计网址,wordpress排名主题,做整装的网站,做网站 兼职1 I2C 通信协议及S3C2410 芯片介绍 I2C(Inter Integrated Circuit) 总线是1980 年由Philips 公司推出的。 I2C 总线用两条线#xff08;SDA 和SCL #xff09;在总线和装置之间传递信息#xff0c;在微控制器和外部设备之间进行串行通信或在主设备和从设备之间进行双向数据传…1 I2C 通信协议及S3C2410 芯片介绍 I2C(Inter Integrated Circuit) 总线是1980 年由Philips 公司推出的。 I2C 总线用两条线SDA 和SCL 在总线和装置之间传递信息在微控制器和外部设备之间进行串行通信或在主设备和从设备之间进行双向数据传送。两条通信线通过上拉电阻被拉升至5 V 。在控制系统中的每个集成电路可以通过一个CMOS 缓冲器来读每一条线路也可以通过一个栅极开路的FET 管将每一条线的电平下拉。因此对每个芯片来 说每条线既是输入线又是输出线。 I2C 总线遵从同步串行传输协议即各位串行一位接一位发送由时钟clock 线指示读数据data 线的时刻。每个数据包前有一个地址以指示由哪个器件来接收该数据。 S3C2410 是一款基于ARM920T 的16/32 位RISC 微处理器主要用于手持设备拥有高性价比低功耗等特点也是目前市面上出现较多的嵌入式开发板的处理器之一。芯片拥有16 KB 的指令和数据缓存器有存储管理单元MMU 、LCD 控制器、3 个串口、4 路DMA 、4 个时钟定时器、8 路10 位的A/D 转换支持I2C 、 I2S 、SPI 、主从USB 等接口以及SD/MMC 卡。 S3C2410 微处理器的I2C 总线可以处于下面4 种模式下主接收模式、主发送模式、从接收模式和从发送模式。处理器对I2C 进行的操作主要是对下面的几个寄存器进行读/ 写 ◇ IIC 控制寄存器IICCON 物理地址0X54000000 内存映射后的虚拟地址     ◇ IIC 控制/ 状态寄存器IICSTAT 物理地址0X54000004      ◇ IIC 数据寄存器IICDS 物理地址0X54000008      ◇ IIC 地址寄存器IICADD 物理地址0X5400000C 。 本设计主要是CPU 工作在主模式下与下面的I2C 接口设备进行通信。 2 Windows CE 系统驱动特点 Windows CE.net 驱动有两种模型本机设备驱动程序和流接口驱动程序。本机设备驱动适于集成到基于Windows CE.net 平台的设备。这些设备驱动程序是一些硬件所必需的是由原始设备制造商创建的用以驱动如键盘、触摸屏、音频设备等往往在设备售出后就不会再更换如通用LED 驱动、电源驱动、键盘驱动和显示驱动等都是本机设备驱动。对于本机设备驱动程序Platform Builder 提供了一些驱动程序样本目的是为了方便开发人员快速开发出自己的驱动程序。当Win CE 系统启动时, 本地设备驱动程序将被加载到系统的内存中。本地驱动程序的开发分为分层驱动和单片驱动程序。分层驱动要利用微软提供的与应用程序通信的上层称为模块驱动程序层MDD Model Device Driver 。MDD 层通过设备驱动程序接口DDI Device Driver Interface 与应用程序通信开发驱动程序通常不修改MDD 层主要关心与具体硬件相关的下层依赖平台的设备驱动程序层 PDD Platform Dependent Driver , PDD 层通过设备驱动服务接口Device Driver Service Provider Interface 直接管理硬件。流接口设备驱动程序指可安装的启动程序可以由第三方生产商提供以支持添加到系统中的设备。Windows CE 下的设备驱动程序在与应用程序相同的保护级上工作。当系统启动时大多数驱动程序是由设备管理进程DEVICE.EXE 加载的所有这些驱动程序 将共享同一个进程地址空间。 3 I2C 总线底层驱动设计 I2C 总线驱动是放在Windows CE 操作系统的内核下层位于OEM Adaptation Layer OAL 层的一个真正的驱动。 3.1 初始化I2C 中断和编写ISR 例程 I2C 的通信是通过操作I2C 的寄存器进行的。在I2C 通信中主要对上面介绍的4 个寄存器进行读写。通过读写这些寄存器中的命令状态字可以检测和控制I2C 总线的行为。在Windows CE.net 下首先要在文件oalintr.h 添加I2C 的中断号的宏定义 #defineSYSINTR_I2C(SYSINTR_FIRMWARE19) 然后在文件cfw.c 的文件中添加I2C 中断的初始化禁止和复位。具体代码如下: 在OEMInterruptEnable 函数中加入     case SYSINTR_IIC:       s2410INT-rSRCPNDBIT_IIC;       if (s2410INT-rINTPND BIT_IIC) s2410INT-rINTPND BIT_IIC;       s2410INT-rINTMSK ~BIT_IIC;       break;     在OEMInterruptDisable 函数中加入     case SYSINTR_IIC:       s2410INT-rINTMSK| BIT_IIC;         break; 在OEMInterruptDone 函数中加入     case SYSINTR_IIC:       s2410INT-rSRCPNDBIT_IIC;       if (s2410INT-rINTPND BIT_IIC) s2410INT-rINTPND BIT_IIC;       s2410INT-rINTMSK ~BIT_IIC;       break; 在armint.c 文件中添加ISR 程序处理中断发生后返回定义的中断号。具体代码如下:     在OEMInterruptHandler 函数中添加     else if (IntPendVal INTSRC_IIC) {       s2410INT-rSRCPND BIT_IIC; /* 清除中断 */       if (s2410INT-rINTPND BIT_IIC) s2410INT-rINTPND BIT_IIC;       s2410INT-rINTMSK| BIT_IIC; /* I2C 中断禁止 */       return (SYSINTR_RTC_ALARM);     } 3.2 编写流驱动程序 I2C 总线驱动程序采用的是Win CE 流驱动的标准形式。在IIC_Init 的函数中首先通过函数VirtualAlloc 和VirtualCopy 把芯片中针对I2C 的物理 地址和操作系统的虚存空间联系起来对虚拟地址空间的操作就相当于对芯片的物理地址进行操作。地址映射的代码如下 reg (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);       if (reg) {         if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) {           RETAILMSG( DEBUGMODE,( TEXT( Initializing interrupt \\n\\r ) ) );           VirtualFree(reg, sz, MEM_RELEASE);           reg NULL;         }       } 其中sz 是申请的长度addr 是申请虚拟地址空间的实际物理地址在Win CE 中的映射地址。     然后对申请到的虚拟地址进行操作安装Windows 中的流驱动的模型进行驱动的编写主要包括下面函数的编写。 IIC_Init      在函数中主要是对I2C 的初始化主要语句如下     v_pIICregs ( volatile IICreg *)IIC_RegAlloc((PVOID)IIC_BASE, sizeof(IICreg));     v_pIOPregs ( volatile IOPreg *)IOP_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));     v_pIOPregs-rGPEUP| 0xc000;     v_pIOPregs-rGPECON | 0xa00000;     v_pIICregs-rIICCON (17) | (06) | (15) | (0xf);     v_pIICregs-rIICADD 0x10;     v_pIICregs-rIICSTAT 0x10;     VirtualFree( ( PVOID )v_pIOPregs,sizeof( IOPreg ),MEM_RELEASE );     v_pIOPregs NULL;     if ( !StartDispatchThread( pIIcHead) )     { IIC_Deinit( pIIcHead );return ( NULL );} 在StartDispatchThread() 函数中, 主要是创建线程、关联事件和中断, 主要语句如下:     InterruptInitialize( 36,pIicHead-hIicEvent,NULL,0 );// 关联时间和中断     CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );// 创建线程等待时间     在IicDispatchThread() 函数中, 主要是等待中断的产生, 然后去执行WaitReturn        WaitForSingleObject( pIicHead-hIicEvent,INFINITE );     IicEventHandler( pIicHead );// 事件处理函数     InterruptDone( 36 );     最后在函数IIC_Open 、IIC_Read 、IIC_Write 中对各个寄存器进行操作进行数据的赋值, 得到I2C 读取的数据和发送数据。 4 I2C 驱动的封装和添加到Windows CE 中 通过上面的工作能编译一个DLL 函数但这还不能叫流接口驱动程序。因为它的接口函数还没有导出还需要告诉链接程序需要输出什么样的函数为此要建立一个自己的def 文件可以用记事本建一个取名mydrive.Def LIBRARY MyDriver     EXPORTS     IIC_Close     IIC_Deinit     IIC_Init     IIC_IOControl     IIC_Open     IIC_PowerDown     IIC_PowerUp     IIC_Read     IIC_Seek     IIC_Write 然后同样用记事本编写一个注册表文件取名为mydrive.reg: [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\STRINGS]     Indexdword:1     PrefixIIC     DllMyDriver.dll     Orderdword:0 最后编写自己的CEC 文件。主要是添加一个Build Method 任务是复制注册表到Win CE 的系统目录下面。加一个Bib File 其主要功能是把编译的mydrive.dll 文件添加到系统内核中去。保存写好的CEC 文件。打开Platform Builder 打开“File” 菜单添加刚刚编写的CEC 特征到系统选项中去。生成系统的时候添加自己的CEC 特性就可以包含刚刚编写的I2C 驱 动了。  以上介绍了Win CE 的驱动结构并给出了基于Win CE 的 I2C 驱动程序部分源代码。实验证明该设计是可行的。 1.1         初始化IIC 中断和编写ISR 例程 IIC 的通信是通过操作IIC 的寄存器进行的。在IIC 通信中主要对上面介绍的4 个寄存器进行读写。通过读写这些寄存器中的命令状态字可以检测和控制IIC 总线的行为。在Windows CE.NET 下我们首先要在文件oalintr.h 添加IIC 的中断号的宏定义 #define   SYSINTR_IIC        (SYSINTR_FIRMWARE19) 然后在文件cfw.c 的文件中添加IIC 中断的初始化禁止和复位。 在OEMInterruptEnable 函数中通过向中断寄存器rSRCPND 的第27 位写入1 表示IIC 中断源有中断请求产生。向中断中断寄存器rINTMSK 的第27 位写入0 则将IIC 中断标记为可处理状态。这样就实现了IIC 中断的初始化。在OEMInterruptDisable 函数中通过向中断寄存器rINTMSK 的第27 位写入1 实现了IIC 中断的禁止。 IIC 驱动程序需要建立一个事件可以使用CreateEvent 函数实现然后调InterruptInitialize 将该事件与IIC 中断号绑定则使能该中断OAL 中的OEMInerrupteEnable 就会被调用如果该函数不返回true 的话InterruptInitialize 就会失败。然后驱动程序中的IST 就可以使用WaitForSingleObject 函数来等待中断的发生。 当一个IIC 中断发生之后操作系统陷入异常中断向量指示进入CE 的异常处理程序该异常处理程序然后调用OAL 的OEMInterruptHandler 函数该函数检测硬件之后将硬件中断转换为软件的中断号返回给系统。该中断号就是上面的InterruptInitialize 中使用的那个中断号。系统得到该中断号之后就会找到该中断号对应的事件并唤醒等待相应事件的线程(IST) 然后IST 就可以在用户态进行中断处理。处理完成之后IST 需要调用InterruptDone 来告诉操作系统中断处理结束操作系统再次调用OAL 中的OEMInterruptDone 函数最后完成中断的处理。 1.2            编写流驱动程序 本IIC 驱动程序采用的是Windows CE 流驱动的标准形式编写在IIC_Init 的函数中通过函数VirtualAlloc 和VirtualCopy 把芯片中针对IIC 的物理地址和操作系统的虚存地址空间联系起来对虚拟地址空间的操作就相当于对芯片的物理地址进行操作。 然后对申请到的虚拟地址进行操作安装Windows 中的流驱动的模型进行驱动的编写主要包括下面的个几个函数的编写 1 IIC_Init( ) 对IIC 进行初始化在设备管理器加载IIC 驱动后首先调用用于初始化所需的变量硬件设备等资源。该过程分配代表设备硬件实例的数据结构并通过硬件抽象接口HWInit 初始化硬件。同时该函数会调用InterruptInitialize 为接收内核中的逻辑中断创建相应事件并初始化临界区。2 StartDispatchThread( ) 主要是创建线程, 关联事件和中断, 主要语句如下: InterruptInitialize( 36,pIicHead-hIicEvent,NULL,0 );// 关联事件和中断 CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );// 创建线程等待时间。 如果StartDispatchThread() 执行后返回false, 则执行 IIC_Deinit() 卸载IIC 驱动。 3 IicDispatchThread( ) 主要是等待中断的产生, 然后去执行 WaitReturn WaitForSingleObject( pIicHead-hIicEvent,INFINITE ); IicEventHandler( pIicHead );     // 事件处理函数 InterruptDone( 36 ); 最后在函数IIC_Open IIC_Read IIC_Write 中对各个寄存器进行操作进行数据的赋值。得到IIC 读取的数据和发送速据。 2            IIC 驱动的封装和添加到Windows CE 中 通过上面的工作我们能编译一个DLL 函数但是这个还不能叫流接口驱动程序因为它的接口函数还没有导出我们还需要告诉链接程序需要输出什么样的函数为此要建立一个自己的def 文件可以用记事本程序编辑一个文件名为“mydrive.Def” 的文件。该文件做的工作就是在EXPORTS 段后面列出要从DLL 中输出的函数的名称。在LIBRARY 后面必须加上要编译文件的实际名然后将这个文件添加到流接口驱动程序的工程里面。 然后同样用记事本编写一个注册表文件取名为“mydrive.reg” 并保存到流接口驱动程序的目录里下面是这个注册表文件的内容。 [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\STRINGS] Indexdword:1 PrefixIIC DllMyDriver.dll Orderdword:0 最后编写自己的CEC 文件。主要任务是添加一个Build Method 任务是copy 注册表到Window CE 的系统目录下面。接着添加一个Bib File 其主要功能是把编译的mydrive.dll 文件添加到系统内核中去。然后保存写好的CEC 文件。打开Platform Build 打开“File” 菜单添加刚刚编写的CEC 特征到系统选项中去。最后生成系统的时候添加自己的CEC 特性就可以包含刚刚编写的IIC 驱动了 本文来自CSDN博客转载请标明出处http://blog.csdn.net/cfanlwn/archive/2009/12/04/4939786.aspx I2C总线工作原理 总线的构成及信号类型 I2C总线是由数据线SDA和时钟SCL构成的串行总线可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送最高传送速率100kbps。各种被控制电路均并联在这条总线上但就像电话机一样只有拨通各自的号码才能工作所以每个电路和模块都有唯一的地址在信息的传输过程中I2C总线上并接的每一模块电路既是主控器或被控器又是发送器或接收器这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分地址码用来选址即接通需要控制的电路确定控制的种类控制量决定该调整的类别如对比度、亮度等及需要调整的量。这样各控制电路虽然挂在同一条总线上却彼此独立互不相关。 I2C总线在传送数据过程中共有三种类型信号 它们分别是开始信号、结束信号和应答信号。 开始信号SCL为高电平时SDA由高电平向低电平跳变开始传送数据。 结束信号SCL为高电平时SDA由低电平向高电平跳变结束传送数据。 应答信号接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲表示已收到数据。CPU向受控单元发出一个信号后等待受控单元发出一个应答信号CPU接收到应答信号后根据实际情况作出是否继续传递信号的判断。若未收到应答信号由判断为受控单元出现故障。 这些信号中起始信号是必需的结束信号和应答信号都可以不要。 目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有CYGNAL的 C8051F0XX系列PHILIPSP87LPC7XX系列MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口 I2C 总线是一种用于IC器件之间连接的双向二线制总线所谓总线它上面可以挂多个器件并且通过两根线连接占用空间非常的小总线的长度可长达25英尺并且能够以10Kbps的最大传输速率支持4个组件。它的另一优点是多主控只要能够进行接收和发送的设备都可以成为主控制器当然多个主控不能同一时间 工作。 I2C总线有两根信号线一根为SDA数据线一根为SCL时钟线。任何时候时钟信号都是由主控器件产生。 I2C总线操作 I2C规程运用主/从双向通讯。器件发送数据到总线上则定义为发送器器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件通常为微控制器控制主器件产生串行时钟SCL控制总线的传输方向并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变SCL为高电平的期间SDA状态的改变被用来表示起始和停止条件。 控制字节 在起始条件之后必须是器件的控制字节其中高四位为器件类型识别符不同的芯片类型有不同的定义EEPROM一般应为1010接着三位为片选最后一位为读写位当为1时为读操作为0时为写操作。 写操作 写操作分为字节写和页面写两种操作对于页面写根据芯片的一次装载的字节不同有所不同。 读操作 读操作有三种基本操作当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。 在这里我们可以用器件的i2c接口链接到i2c总线上也可以用主控芯片的GPIO端口来模拟i2c接口。 I2C数据格式如下 无数据SCL1SDA1 开始位Start当SCL1时SDA由1向0跳变 停止位Stop当SCL1时SDA由0向1跳变 数据位当SCL由0向1跳变时由发送方控制SDA此时SDA为有效数据不可随意改变SDA 当SCL保持为0时SDA上的数据可随意改变 地址位定义同数据位但只由Master发给Slave 应答位ACK当发送方传送完8位时发送方释放SDA由接收方控制SDA且SDA0 否应答位NACK当发送方传送完8位时发送方释放SDA由接收方控制SDA且SDA1。 当数据为单字节传送时格式为 开始位8位地址位含1位读写位应答8位数据应答停止位。 当数据为一串字节传送时格式为 开始位8位地址位含1位读写位应答8位数据应答8位数据应答……8位数据应答停止位。 需要注意的是 1SCL一直由Master控制SDA依照数据传送的方向读数据时由Slave控制SDA写数据时由Master控制SDA。当8位数据传送完毕之后应答位或者否应答位的SDA控制权与数据位传送时相反。 2开始位“Start”和停止位“Stop”只能由Master来发出。 3地址的8位传送完毕后成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时将放弃数据传送发送“Stop”。 4当写数据的时候Master每发送完8个数据位Slave设备如果还有空间接受下一个字节应该回答“ACK”Slave设备如果没有空间接受更多的字节应该回答“NACK”Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时此时Master放弃数据传送发送“Stop”。 5当读数据的时候Slave设备每发送完8个数据位如果Master希望继续读下一个字节Master应该回答“ACK”以提示Slave准备下一个数据如果Master不希望读取更多字节Master应该回答“NACK”以提示Slave设备准备接收Stop信号。 6当Master速度过快Slave端来不及处理时Slave设备可以拉低SCL不放SCL0将发生“线与”以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。 在实际应用中并没有强制规定数据接收方必须对于发送的8位数据做出回应尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下编程者可以事先约定数据传送的长度不发送ACK有时可以起到减少系统开销的效果。
http://www.pierceye.com/news/958795/

相关文章:

  • 关于文化的网站模板做免费小说网站怎样赚钱
  • 做外贸的人常用的网站黄骅贴吧二手房
  • 网站建设科目提供网站建设教学视频
  • iis搭建网站教程win10淘宝客网站建设的策略
  • 怎么做一个网站 免费90平方设计
  • 网站建设的目的与意义是什么东营网站建设教程
  • 盐城seo网站优化珠海微信网站
  • 杭州市住房和城乡建设部网站网站建设项目计划书如何写
  • 免费找客户网站wordpress knowhow 下载
  • 大连企业招聘网站网站功能描述书须包含哪些内容
  • 教用vs2013做网站的书王烨医生
  • 滨州网站建设费用哪家购物网站建设好
  • 网站开发客户流程 6个阶段wordpress添加多个下载地址
  • 莱芜网络公司网站深圳网站建设raygf
  • pythom+网站开发规范wordpress用户权利
  • 国外营销型网站建设c网站开发
  • 深圳建设厅网站网站建设平台开发
  • 网站开发咨询seo点击优化
  • 靖安县城乡规划建设局网站做的美食视频网站
  • 福永网站推广徽标设计制作
  • 做网站发布网网站需求建设书
  • 咖啡店网站建设模版四川建设网四川住建厅
  • 官方网站建设怎么样郑州搜索引擎优化
  • 三只松鼠网站谁做的大学网页设计作业
  • 关于建设网站的请示做哪种类型的网站赚钱呢
  • 西安网站seo优化做cpa广告建什么网站好
  • 南京手机网站开发网站建设需要哪些岗位
  • 青白江区网站开发招聘宿迁网站设计
  • 做暧暖爱视频每一刻网站wordpress头条采集
  • 海淀网站开发如何免费推广网站