3.1 初始化I2C中断和编写ISR例程 I2C的通信是通过操作I2C的寄存器进行的。在I2C通信中主要对上面介绍的4个寄存器进行读写。通过读写这些寄存器中的命令状态字可以检测和控制I2C总线的行为。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中断号的宏定义: #defineSYSINTR_I2C(SYSINTR_FIRMWARE+19) 然后在文件cfw.c的文件中添加I2C中断的初始化,禁止和复位。具体代码如下: 在OEMInterruptEnable函数中加入 case SYSINTR_IIC: s2410INT->rSRCPND=BIT_IIC; if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND = BIT_IIC; s2410INT->rINTMSK&= ~BIT_IIC; break; 在OEMInterruptDisable函数中加入 case SYSINTR_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()和Virtua扁平线圈电感生产厂lCopy(),把芯片中针对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 " ) ) ); 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 = (1<<7) | (0<<6) | (1<<5) | (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_MACHINEDriversBuiltInSTRINGS] &qu电感规格ot;Index"=dword:1 "Prefix"="IIC" "Dll"="MyDriver.dll" "Order"=dword:0 最后编写自己的CEC文件。主要是添加一个Build Method,任务是复制注册表到Win CE的系统目录下面。加一个Bib File,其主要功能是把编译的mydrive.dll文件添加到系统内核中去。保存写好的CEC文件。打开Platform Builder,打开“File”菜单,添加刚刚编写的CEC特征到系统选项中去。生成系统的时候,添加自己的CEC特性,就可以包含刚刚编写的I2C驱动了。
过流保护电路分析提问:1.二极管D1/D2/D3是个什么二极管,在上图起什么作用2.这两图纸是干嘛的3.CT1812是个什么变压器4.D10二极管4148有没有接反,什么作用5.电容C11什么作用
不就是两个互感器电 请教,单片机仿真,现在用啥软件?请教,单片机仿真,现在用啥软件? 比如,STM32F429的仿真。 谢谢!下载仿真,这种单片机可以烧录很多次的。
这是软件仿真了!有道理!谢谢!
仿真不如实际测试
MDK5或者IAR
这是软件仿真呀 LED灯具结构介绍及外观设计问题解析LED路灯的应用受到诸多企业的关注与青睐,但在结构设计,照明创意、造型设计等方面存在一些问题,给业主的使用与挑选造成了不小的困惑。本文论述了LED灯具结构及外观设计存在的五点问题并提出了相应的解决方案
2/3 首页 上一页 1 2 3 下一页 尾页 |