WIZnet I2C TCP/IP 演示
[嵌入式以太网示例]
此处提供的嵌入式 Web 服务器实现使用硬件 TCP/IP 协处理器。
本演示是目前可供下载的 4 个嵌入式以太网演示之一。
标准 FreeRTOS 演示应用程序旨在作为参考和新应用程序的入门。
除标准演示之外,此演示中还包含此嵌入式 Web 服务器演示,以提供更针对于应用程序的示例。
此应用程序不包含功能齐全的 Web 服务器,但提供了一个可工作的、抢占式的、多任务的示例,其中包括
中断驱动的 I2C 驱动程序和中断驱动接口
(带 WIZnet W3100A TCP/IP 协处理器)。
实现的详细信息
嵌入式计算机
TCP/IP 和以太网接口板是连接到
LPC-P2106 ARM7 原型板的扩展端口的简单 PCB。
RTOS 移植和 ARM7 开发工具
此嵌入式 Web 服务器演示使用标准FreeRTOS LPC2000 移植与
GNUARM GCC 开源开发工具编写。
处理器在可能的情况下以 THUMB 模式运行。
源文件
项目 makefile 包含在 Demo/WizNET_DEMO_GCC_ARM7 目录中。
请参阅源代码组织章节,获取
FreeRTOS 目录结构体和 ARM7 GCC 移植页面的完整说明,
以了解关于使用开发工具的更多信息。
下载内容包括以下文件:
-
main.c - 初始化硬件,创建演示应用程序任务,然后启动 RTOS 调度器。
-
http_serv.c - 处理套接字创和建传入连接的顺序。 这是一个非常简单的文件。
-
tcp.c - 处理服务器任务和 WIZnet 模块之间的所有消息。 请参阅 WIZnet W3100A
数据表。
-
tcpISR.c - 包含中断服务程序,该程序处理源自 WIZNet TCP/IP 事件的外部中断。
它在一个单独的文件中,因为它必须在 ARM 模式下运行。
-
i2c.c - i2c 驱动程序实现。
-
i2cISR.c - i2c 中断服务程序。 它必须在一个单独的文件中,因为它在 ARM 模式下运行。
-
html_pages.h - 包含作为服务页面的静态部分发送的字符串。
此外,还需要标准演示应用程序中的 flash.c 文件。
操作原理
演示应用程序任务。
此演示可创建 18 个任务,包括 15 个标准演示任务、嵌入式 Web 服务器任务、错误检查任务和空闲任务。
HTTP 服务器任务是最高优先级,因此每次出现 i2C 中断或来自 WIZnet W3100A 设备的外部中断时,
它都会优先执行任何其他任务。
网络服务器任务:
-
初始化 WIZnet 寄存器。
-
创建套接字。
-
正在侦听连接的块。
-
处理一个连接。
-
事务完成后关闭套接字。
-
然后回到第 1 步重新开始。
Web 服务器任务花费了大部分时间处于阻塞状态,等待来自 WIZnet TCP/IP 处理器或
I2C 外围设备的中断。
这是一个非常基本的实现,一次允许
一个连接,并且在 HTML 页面传输完成后立即关闭连接。
I2C 接口
HTTP 服务器任务通过 I2C 总线与 WIZnet TCP/IP 处理器通信。
I2C 驱动程序管理“消息”池
(请参阅 i2c.h 中定义的 xI2CMessage 结构体)。 当应用程序任务调用 i2cMessage() 时,I2C 驱动程序将用消息详细信息
填充 xI2CMessage 结构体,
然后将新的 xI2CMessage 结构体放入等待执行的
消息队列中。 这样,应用程序任务就可以继续执行,而不必等待I2C消息被事务处理。
I2C 中断程序处理通过 I2C 总线发送/接收数据的外围设备生成的事件。 当一条消息
完成后,它会检查队列,查看是否还有其他消息等待传输。 如果是,则下一条消息将从
队列移除并立即开始传输。
通过使用 i2cMessage() 函数的 xMessageCompleteSemaphore 参数,应用程序任务可以选择等待(阻塞),
直至 I2C 消息被完全处理。 当它被阻塞时,将执行其他任务。 这尤其
与在 I2C 总线上读取数据相关,因为应用程序任务需要知道何时会接收到数据。
WIZnet 接口
WIZnet 设备在需要注意时断言外部中断 EINT0,但是 I2C 接口使
EINT0 中断处理变得复杂。
WIZnet 设备内的 C0_ISR 寄存器用于确定
中断的原因,但 I2C 接口意味着 C0_ISR 无法从中断服务程序内读取
数据。 此外,中断的断言也无法清除,因为这也需要写入 WIZnet 设备,
同样要通过 I2C 总线。
在中断 (EINT0) 仍然被断言的情况下,离开中断服务程序的唯一方法
是禁用微控制器内的 I2C 中断(否则将立即重新进入
中断服务程序)。 在禁用 I2C 中断后,中断服务程序将取消阻塞 Web 服务器任务,
该任务则必须立即读取 C0_ISR 寄存器,清除中断,然后在微控制器中重新启用 I2C 中断。
因此,重要的是,Web 服务器任务是最高优先级任务,从而确保它始终
能在 EINT0 中断后立即执行。
源代码中的注释提供了更多详细信息。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.