基于ARM和W5100的嵌入式以太网通信接口(3)
- UID
- 1029342
- 性别
- 男
|
基于ARM和W5100的嵌入式以太网通信接口(3)
4.3 中断处理程序设计
本设计采用中断方式来处理数据包的接收和发送,以提高效率。在W5100处理中断的过程中,微处理器首先通过应访问W5100的中断寄存器(IR)获得产生中断的来源。中断寄存器与中断屏蔽寄存器配合使用,且位是一一对应的,中断屏蔽寄存器(IMR)的相应位可屏蔽中断寄存器中任何中断源。因此,若要使用某个中断源,先要将该中断源在中断屏蔽寄存器中的相应位置位,以打开所需的中断源,这样,中断才会产生。当中断产生后,即进入中断处理程序。本设计中的中断源主要包括端口n中断事件。一般设置有Socket成功连接(S_IR_CON)、断开连接(S_IR_DISCON)、数据发送完成(S_IR_SENDOK)、接收到数据(S_IR_RECV)或传输超时(S_IR_TIMEOUT)等事件中断。
本文以端口0接收到数据包后的产生一个接收数据中断为例说明中断处理过程。首先,在使用端口0中断之前,应在初始化程序中将中断屏蔽寄存器(IMR)中的端口0置位(IMR_S0_INT),当Socket0发生中断时,IMR_S0_INT=1、IR_S0_INT=1、动态LED灯亮显示接收状态,此时,W5100的中断输出管脚(/INT)输出低电平,以通知微处理器有中断产生,微处理器访问中断寄存器获取中断源为接收数据中断;然后进入中断处理函数,启动发送函数(S_rx_process)。
4.4 Socket数据接收程序设计
当端口接收数据时,产生接收中断。首先调用端口接收数据包函数Process_Socket_Data(),并对接收到的数据类型进行判断和加工。本过程先调用接收函数S_rx_process()从W5100端口的接收数据缓存区读取数据,然后将读取的数据加上接收存储器读指针寄存器(S0_RX_RD)的值再写入S0_RX_RD,最后将RECV命令重新写入端口0的命令寄存器(S0_CR),以等待下次数据的接收。或者将处理完的数据拷贝到发送缓冲区,再调用S_tx_process函数发送数据包给CPU。主要程序如下:
其中Oxaa和Ox55为接收数据包的标志头;长度位为数据包字节长度,不包括数据包头和本身字符,命令位为对对象数据的操作,为0时读取数据,为1时设置对象数据,目标代码位用来显示对象代码,如Ox00为网关IP、Ox01为子网掩码、0x02为物理地址、LED为状态显示等;数据位为接收到的数据,数据是以16进制形式接收,最后再加上2 B的数据报头和1 B的数据本身。
4.5 Socket数据发送程序设计
通过Socket发送数据时,调用发送数据函数S_tx_process。首先把要发送的数据缓存在发送缓冲区(Tx_buffer)中。此外,在发送数据时,需先检查发送缓存区的剩余空间的大小(Sn_TX_FSR),控制发送数据的字节数,如用以太网协议发送的数据最大传送单元(MTU)不超过1 500 B。在TCP服务器模式下,在数据发送处理过程中,可不设置目标主机的IP和端口号。剩余空间的大小因写入数据的增加而减少,数据发送后又自动增加。当发送缓冲区的数据完全写入端口的发送数据缓存区后,则将数据本身长度加上端口传输写指针寄存器(Sn_TX_WR)中的值再写入Sn_Tx_WR,再计算发送缓冲区的偏移量(tx_offset),用于指示发送数据的长度,最后启动发送(Sn_CR_SEND)。相关程序如下:
i=tx_offset/S_TX_SIZE //计算实际物理偏移值,
//S_TX_SIZE由TMSR定义为2 K
tx_offset=tx_offset-i*S_TX_SIZE //计算实际物理地址
//j= W5100_TX+s*S_TX_SIZE+tx_offset
Write_W5100(j,Tx_Buffer) //将发送缓冲区中的
//数据写入到端口的发送缓冲区
Write_W5100((W5100_S0_CR+s*0x100),S_CR_SEND)
//启动发送的指令
本文以基于ARM Cortex-M3的微处理器STM32F105V为核心,结合W5100网络控制芯片实现了嵌入式以太网的连接,该接口设计具有硬件设计简单、成本低、集成高度以及软件开发周期短等优点,在自动化控制和数据传输领域有着广泛的市场和应用前景。 |
|
|
|
|
|