关键词
TC397 官方例程;TC397 以太网例程;TC397 GETH;
简介
本篇为 Aurix TriCore TC397 以太网官方例程分析,重点关注其硬件行为
调试所用的开发板型号:KIT-A2G-TC397-5V-TFT
所使用的例程:Ethernet_1_KIT_TC397_TFT
英飞凌 TriCore 官方例程下载地址:
GitHub - Infineon/AURIX_code_examples: This repository contains code example projects for the AURIX™ Development Studio.
系列文章链接
// 函数调用栈
core0_main()
|--> Ifx_Lwip_init()
声明默认的 IP 地址、子网掩码以及网关地址:
// Libraries/Ethernet/lwip/port/src/Ifx_Lwip.c
/* LWIP initialization function */
void Ifx_Lwip_init(eth_addr_t ethAddr)
{
...
// IP 地址声明
ip_addr_t default_ipaddr, default_netmask, default_gw;
IP4_ADDR(&default_gw, 0,0,0,0);
IP4_ADDR(&default_ipaddr, 0,0,0,0);
IP4_ADDR(&default_netmask, 255,0,0,0);
该例程使用的是 IPv4 协议,其定义如下所示:
// Libraries/Ethernet/lwip/src/include/lwip/ip4_addr.h
/** This is the aligned version of ip4_addr_t,
used as local variable, on the stack, etc. */
struct ip4_addr {
u32_t addr;
};
/** ip4_addr_t uses a struct for convenience only, so that the same defines can
* operate both on ip4_addr_t as well as on ip4_addr_p_t. */
typedef struct ip4_addr ip4_addr_t;
------------------------------------------------------
// Libraries/Ethernet/lwip/src/include/lwip/ip_addr.h
typedef ip4_addr_t ip_addr_t;
...
#define IP_IS_V4_VAL(ipaddr) 1
#define IP_IS_V6_VAL(ipaddr) 0
#define IP_IS_V4(ipaddr) 1
#define IP_IS_V6(ipaddr) 0
其中,IP_IS_V4 以及 IP_IS_V4_VAL 宏控制所使用的 IP 协议版本,这里可以看到为 IPv4 协议,IP 地址使用结构体描述,其仅包含一个成员:32-bit 的地址 addr
变量声明后使用 IP4_ADDR 宏进行初始化,具体如下所示:
// Libraries/Ethernet/lwip/src/include/lwip/ip4_addr.h
/* Set an IP address given by the four byte-parts */
#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))
其中,LWIP_MAKEU32 宏定义如下所示:
// Libraries/Ethernet/lwip/src/include/lwip/def.h
/* Create u32_t value from bytes */
#define LWIP_MAKEU32(a,b,c,d) (((u32_t)((a) & 0xff) << 24) | \
((u32_t)((b) & 0xff) << 16) | \
((u32_t)((c) & 0xff) << 8) | \
(u32_t)((d) & 0xff))
LWIP_MAKEU32(a,b,c,d) 宏将传入的参数,转换为 32-bit 的常量,其中,a, b, c, d 由高到低分别表示 32-bit 数据的 8-bit,其对应关系如下所示:
0000 0000 0000 0000
a b
0000 0000 0000 0000
c d
计算机系统可能为小端序也可能为大端序,但是网络协议一般为大端序,因此需要使用 PP_HTONL 宏进行转换:
// Libraries/Ethernet/lwip/src/include/lwip/def.h
#define PP_HTONL(x) ((((x) & (u32_t)0x000000ffUL) << 24) | \
(((x) & (u32_t)0x0000ff00UL) << 8) | \
(((x) & (u32_t)0x00ff0000UL) >> 8) | \
(((x) & (u32_t)0xff000000UL) >> 24))
其中,HTONL 的含义为 H --> Host,TO --> to,N --> Network,L --> long,即将主机使用的地址变量,转换为网络使用的地址变量,类型为 long(32-bit)
原本 32-bit 数据使用 0xabcd 表示(这里每个字母占 8-bit),使用该宏转换的结果为:0xdcba
以默认 IP 地址初始化为例,该宏展开如下所示:
// Libraries/Ethernet/lwip/port/src/Ifx_Lwip.c
void Ifx_Lwip_init(eth_addr_t ethAddr)
{
...
IP4_ADDR(&default_ipaddr, 0,0,0,0);
------------------------------------------------------------------------
// 宏展开
--> default_ipaddr->addr = PP_HTONL(LWIP_MAKEU32(0,0,0,0))
--> default_ipaddr->addr = PP_HTONL(0x00000000) // 0x00000000 --> 0xabcd,注意这里每个字母占 8-bit
--> default_ipaddr->addr = 0x00000000 // 0x00000000 --> 0xdcba,注意这里每个字母占 8-bit
下一篇:[TriCore][官方例程][TC397以太网例程详解] - 6.内存 & 协议等初始化-CSDN博客