Presentation is loading. Please wait.

Presentation is loading. Please wait.

嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计.

Similar presentations


Presentation on theme: "嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计."— Presentation transcript:

1 嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计

2 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

3 基于ARM的硬件设计 主要介绍基于ARM7的嵌入式硬件开发平台的设计方法,包括结构、主要接口、存储器选用方案以及外设、显示等方面的内容。
嵌入式硬件开发平台的体系结构 外围存储器接口设计方法 键盘、LCD等人机交互接口的设计 触摸屏的设计 以太网设计 CAN总线设计

4 Samsung S3C44B0X Samsung S3C44B0X微处理器是三星公司专为手持设备和一般应用提供的高性价比和高性能的微控制器解决方案,它使用ARM7TDMI核,工作在66MHZ。为了降低系统总成本和减少外围器件,这款芯片中还集成了下列部件: 8KB Cache、外部存储器控制器、LCD控制器、4个DMA通道、2通道UART、1个多主I2C总线控制器、1个IIS总线控制器,5通道PWM定时器及一个内部定时器、71个通用I/O口、8个外部中断源、实时时钟、8通道10位ADC等。

5 基于ARM的嵌入式硬件平台体系结构

6 芯片体系结构

7 S3C44B0X存储系统的特征 支持数据存储的大/小端选择(通过外部引脚进行选择)
地址空间:具有8个存储体,每个存储体可达32Mb,总共可达256Mb。 对所有存储体的访问大小均可进行改变(8位/16位/32位) 8个存储体中,Bank0-Bank5可支持ROM、SRAM;Bank6、Bank7可支持ROM、SRAM和FP/EDO/SDRAM等。 7个存储体的起始地址固定,1个存储体的起始地址可变。

8 复位后的S3C44B0X的存储器映射表

9 系统的存储空间分配 Bank0:两片512KFlash,放置系统引导程序,系统上电复位后,PC指针自动指向Bank0的第一个单元,进行系统自举。。 Bank1:K9F2808(三星 16Mbyte Flash),非线性寻址。具体的时序可以参考K9F2808的datasheet Bank2:USBN9603。USB设备端接口芯片,占用系统外部中断0。8位数据总线。 Bank3、Bank4未接设备。可以供扩展使用 Bank5:RTL8019AS,ISA总线兼容的10M以太网(PHY+MAC层)控制芯片。占用系统外部中断1,16位数据总线

10 Bank6:SDRAM,起始地址为0xC000000。在SDRAM中,前512Kbyte的空间划分出来,作为系统的LCD显示缓冲区使用(更新其中的数据,就可以更新LCD的显示)。系统的程序存储空间从0xC080000开始。也就是,引导系统的时候,需要把system.bin文件复制到0xC080000开始的地址空间,把PC指针指向0xC080000。 Bank7:未使用。可以扩展另一片SDRAM,或者其他的外设。 系统的同步串行口(SIO),连接着触摸屏控制芯片FM7843(与ADS7843完全兼容)。在同步串行口上,还可以扩展其他的芯片。靠IO口控制设备的片选信号(CS)来防止设备的冲突。 注:系统的扩展接口上,A0的标号,连接在S3C44B0X的ADDR1上,后面的地址依次向后错位。

11 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

12 S3C44B0X与FLASH的连接(Half Word方式)

13 存储器接口设计 使用Bank0上的两片512Kb×2来放置系统BIOS,系统上电以后,PC指针自动指向Bank0的第一个单元,开始进行系统自举。系统自举完成以后,便从硬盘中将系统文件和用户应用程序复制到SDRAM内存中执行。 Bank1上接16M非线性Flash,当做系统硬盘使用,可以构造文件系统,存放海量数据。 用SDRAM当作系统内存,只有Bank6/Bank7能支持SDRAM,所以将SDRAM接在Bank6上。如果同时使用Bank6/Bank7,则要求连接相同容量的存储器,而且其地址空间在物理上是连续的。

14 关于BOOT ROM 1、管理处理器的中断服务程序
Bank0:系统的启动ROM(Flash Rom)。在系统复位的时候,处理器的PC(程序计数器)指针指向0x0地址。在Bank0的起始地址的程序,就是系统的初始化程序。此程序的主要任务是: 1、管理处理器的中断服务程序 处理器的中断是从0x0地址开始,引导ROM负责把这一部分的中断映射到另一个区域,以便系统处理。具体的做法,可以参考44binit.s里面的代码。(这部分代码是三星主页可以提供,它把系统的中断,映射到了不同的指针所指向的地址空间(主要就是系统RAM的空间))。

15 2、初始化硬件平台,配置其他的Bank S3C44B0X的Bank0是通过外部的一个管脚提供的上拉、下拉电阻来配置的。主要包括:数据位数(8位、16位、32位),数据格式(大端、小端)。而其他的Bank的配置,以及读写周期等信息是靠Bank0内部的代码配置相应的寄存器来实现的。同时,系统的引导Rom也负责配置系统的其他的一些寄存器,比如,系统的PLL(锁频环)配置,系统的IO口等一些端口功能的配置等等。

16 4、系统的软件设置,更新系统(system.bin)
3、系统自动检测 引导Rom负责检测系统的启动所必须的外设是否正常。主要是系统的SDRAM的检测。 4、系统的软件设置,更新系统(system.bin) 用户可以在系统启动的时候,按任意键,进入系统的软件设置状态。通过引导Rom设置或者查看系统的一些软件信息。包括:通过开启USB端口;更新系统文件system.bin;LCD显示测试;演示程序的装载测试;键盘测试;触摸屏的坐标校准;触摸屏测试;以太网地址的设置等

17 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

18 嵌入式开发板与PC机的串行通讯 嵌入式开发板和PC机的通讯电缆可以按照如图所示的方式连接。

19 I/O接口设计 I/O接口电路也简称接口电路。它是主机和外围设备之间交换信息的连接部件(电路)。它在主机和外围设备之间的信息交换中起着桥梁和纽带作用。设置接口电路的必要性: a)解决CPU和外围设备之间的时序配合和通信联络问题。 b)解决CPU和外围设备之间的数据格式转换和匹配问题。 c)解决CPU的负载能力和外围设备端口选择问题。

20 I/O接口的编址方式 1)I/O接口独立编址: 2)I/O接口与存储器统一编址方式:
这种编址方式是将存储器地址空间和I/O接口地址空间分开设置,互不影响。设有专门的输入指令(IN)和输出指令(OUT)来完成I/O操作。 2)I/O接口与存储器统一编址方式: 这种编址方式不区分存储器地址空间和I/O接口地址空间,把所有的I/O接口的端口都当作是存储器的一个单元对待,每个接口芯片都安排一个或几个与存储器统一编号的地址号。也不设专门的输入/输出指令,所有传送和访问存储器的指令都可用来对I/O接口操作。

21 两种编址方式有各自的优缺点 1)独立编址方式: 2)统一编址方式
主要优点:内存地址空间与I/O接口地址空间分开,互不影响,译码电路较简单,并设有专门的I/O指令,所以编程序易于区分,且执行时间短,快速性好。 缺点:只用I/O指令访问I/O端口,功能有限且要采用专用I/O周期和专用I/O控制线,使微处理器复杂化。 2)统一编址方式 主要优点:访问内存的指令都可用于I/O操作,数据处理功能强;同时I/O接口可与存储器部分共用译码和控制电路。 缺点:一是I/O接口要占用存储器地址空间的一部分;二是因不用专门的I/O指令,程序中较难区分I/O操作。

22 S3C44B0X的I/O接口 ARM系统完成I/O功能的标准方法是使用存储器映射I/O。这种方法使用特定的存储器地址。当从这些地址加载或向这些地址存储时,它们提供I/O功能。典型情况下,从存储器映射I/O地址加载用于输入,而向存储器映射I/O地址存储用于输出。 S3C44B0X有71 个多功能输入\输出管脚,构成了7个I/O接口: 两个9位的输入/输出接口(E和F) 两个8位的输入/输出接口(D和G) 一个16位的输入/输出接口(C) 一个10位的输出接口(A) 一个11位的输出接口(B)

23 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

24 键盘接口设计 键盘模块键盘可能用来输入数字型数据或者选择控制设备的操作模式。
键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。嵌入式控制器的功能很强,可能允分利用这一资源。

25 键盘扫描阵列 一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

26

27 一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

28 键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。
消抖算法: 组合键处理

29 键盘扫描程序 //得到按键的扫描码,格式为0xXYZW U16 GetScanKey() { U16 key; U8 i,temp;
for(i=1;i<0x10;i<<=1){ //I/O口送出数据 rPDATD|=0xf; rPDATD&=~i; key<<=4; OSTimeDly(1);//操作系统延时 temp=rPDATD; key|=(temp>>4); } return key;}

30 编写键盘扫描函数, //得到按键的扫描码,格式为0xXYZW { unsigned short key;
unsigned short MyGetScanKey() { unsigned short key; unsigned int i,temp; for(i=1;i<0x10;i<<=1) rPDATE|=0xf0;初始化端口 rPDATE&=~(i<<4); //向列所在端口分别发送1110,1101, ,0111 key <<=4;//左移四位 Delay(10);//延时,等待响应 temp=rPDATC;//读各行状态值 key|=(temp&0xf);//将四次所得结果保存起来 } return key;

31 unsigned int MyGetKey()
{ int i; unsigned short key,tempkey=1; static unsigned short oldkey=0xffff; static unsigned char keystatus=0; unsigned char keycnt=0; while(1){ key=0xffff; while(1){ key=MyGetScanKey(); if(key!=0xffff)//有键按下 break; OSTimeDly(20); oldkey=0xffff; } OSTimeDly(50); //去抖动 if(key!=MyGetScanKey()) continue;//如果两次的键值不同,重新扫描 if(oldkey!=key) keystatus=0;

32 if(keystatus==0) //第一次按下此键
{ keycnt=0; keystatus=1; } else if(keystatus==1) //第二次重复此键 { keycnt++; if(keycnt==20) keystatus=2; else continue; } oldkey=key; break;

33 for(i=0;i<16;i++)//查找按键,不包括功能键
{ if((key&tempkey)==0) break; tempkey<<=1; } return MykeyBoard_KeyMap[i]; } 函数中定义键盘映射: Unsigned char MykeyBoard_KeyMap[]={1,4,7,10,2,5,8,0,3,6,9,11,12,13,14,15}; //10-退格,11-*/.,12-↑,13-↓,14-确定,15-取消

34 编写主程序(无操作系统),将得到的键值转化为ASCII码发送到串口。
int Main(int argc, char **argv) { unsigned int key; unsigned int tempkey=0; Uart_SendByte(0,0xa); //向串口发送0xa,表示换行 Uart_SendByte(0,0xd); //回车 for (;;) { key=MyGetKey(); key&=0x000f; if(key>9) { Uart_SendByte(0,0x31); tempkey=key-10; Uart_SendByte(0,tempkey|=0x0030); } else Uart_SendByte(0,key|0x0030); Uart_SendByte(0,0x2c); } //送“ ,”号 return 0; }

35 定义键盘响应函数,将得到的键值在液晶屏上显示。
void onKey(int nkey, int fnkey)//键盘响应函数 { char temp[3];//转换成ASC-II的键值数组 if(nkey>9) { temp[0]=0x31; temp[1]=(nkey-10)|0x30; temp[2]=0; } //字符串结束标志 else { temp[0]=nkey+0x30; temp[1]=0; } LCD_printf(temp);//在液晶屏上显示键值 LCD_printf("\n"); }

36 void Main_Task(void *Id) //Main_Test_Task
{ POSMSG pMsg=0; LCD_ChangeMode(DspTxtMode); //Lcd进入文本模式 LCD_Cls(); //清屏  for(;;){ pMsg=WaitMessage(0); //等待消息 switch(pMsg->Message){ case OSM_KEY: //键盘消息 onKey(pMsg->WParam,pMsg->LParam); //键盘响应函数 break; Delay(200); } DeleteMessage(pMsg);//删除消息,释放资源 } }

37 void My_Key_Scan_Task(void *Id) //键盘扫描任务
{ U32 key; u32 tempkey=0; POSMSG pmsg; //创建消息 Uart_Printf("begin key task \n"); for (;;) { key=MyGetKey(); key&=0x000f; if(key>9) { Uart_SendByte(0,0x31); tempkey=key-10; Uart_SendByte(0,tempkey|=0x0030); } else Uart_SendByte(0,key|0x0030); Uart_Printf(","); pmsg=OSCreateMessage(NULL, OSM_KEY,key,key); //创建键盘消息 if(pmsg) SendMessage(pmsg);} //发送键盘消息 }

38 LCD接口设计 LCD显示模块 液晶显示是一种被动的显示,它不能发光,只能使用周围环境的光。它显示图案或字符只需很小能量。液晶显示所用的液晶材料是一种兼有液态和固体双重性质的有机物,它的棒状结构在液晶盒内一般平行排列,但在电场作用下能改变其排列方向。 LCD的背光: EL(场致发光): 小时 和LED光源:字符模式,50000小时

39 LCD的显示方式 反射型LCD:底偏光片后面加了一块反射板,它一般在户外和光线良好的办公室使用。

40 反射型LCD的结构

41 LCD的驱动方式 LCD通常由两种方式,一种是带有驱动芯片的LCD模块,基本上属于半成品
如果有需要,也可以直接使用芯片上的内置LCD控制器来构造显示模块,它可以支持彩色/灰度/单色三种模式,灰度模式下可支持4级灰度和16级灰度,彩色模式下最多支持256色,LCD的实际尺寸可支持到320X240。

42 嵌入式处理器与LCD的连接 嵌入式处理器 数据总线 LCD模块 寄存器选择 使能信号

43 LCD的显示控制 从系统结构上来讲,由于显示器模块中已经有显示存储器。显存中的每一个单元对应LCD上的一个点,只要显存中的内容改变,显示结果便进行刷新。于是便存在两种刷新: 1.直接根据系统要求对显存进行修改,一种是只需修改相应的局部就可以,不需要判断覆盖等;另一种就是有覆盖问题,计算起来比较复杂,而且每做一点小的屏幕改变就进行刷新,将增加系统负担。 2 .专门开辟显示内存,在需要刷新时候由程序进行显示更新。这样,不但可以减轻总线负荷,而且也比较合理,在有需要的时候进行统一的显示更新,界面也可以比较美观,不致由于无法预料的刷新动作导致显示界面闪烁。

44 前后台双重显示缓存的显示模块结构

45  与LCD有关的函数: void LCD_Cls(); //文本模式下清除屏幕 void LCD_ChangeMode(U8 mode); //在图形模式和字符模式下切换 void LCD_Refresh(); //图形刷新显示 void LCD_Init(); //初始化LCD控制寄存器 void LCD_printf(const char *format,...); //输入格式化字符到LCD void LCD_txtRefresh(); //字符显示刷新 void LCDBkLight(U8 isOpen); //打开/关闭LCD背光 void LCDDisplayOpen(U8 isOpen); //打开/关闭LCD显示

46 触摸屏接口设计 触摸屏的分类 电阻式触摸屏 表面声波触摸屏 红外式触摸屏 电容式触摸屏

47 电阻式触摸屏 分为四线电阻和五线电阻触摸屏
电阻技术触摸屏是一种对外界完全隔离的工作环境,故不怕灰尘、水汽和油污,可以用任何物体来触摸,比较适合工业控制领域及办公室内有限人的使用。

48 四线电阻触摸屏原理

49 测量原理 Y Y V X 在触摸点X、Y坐标的测量过程中,测量电压与测量点的等效电路图所示,图中P为测量点

50 触摸屏芯片

51 FM(ADS)7843的特点 实现触摸屏的驱动选择控制(X、Y通道) 对于输入电压或附加电压进行AD转换 同步串行接口
最大转换速率125KHz 可编程控制8位或者12位转换模式 工作电压2.7V-5.0V 两个附加的输入端口

52 FM7843与ARM的连接

53 AD7843的工作时序 Arm同步串口(SIO)向ADS7843发送控制字 转换完成后从ADS7843串口读出电压转换值

54 .触摸屏与显示器的配合 ADS7843送回控制器的X与Y值仅是对当前触摸点的电压值的A/D转换值,它不具有实用价值。这个值的大小不但与触摸屏的分辨率有关,而且也与触摸屏与LCD贴合的情况有关。而且,LCD 分辨率与触摸屏的分辨率一般来说是不一样,坐标也不一样,因此,如果想得到体现LCD坐标的触摸屏位置,还需要在程序中进行转换。假设LCD分辨率是320*240,坐标原点在左上角;触摸屏分辨率是900*900,坐标原点在左上角,则转换公式如下: xLCD=[320*(x-x2)/(x1-x2)]; X2为LCD原点值,X1为终点值 yLCD=[240*(y-y2)/(y1-y2)]; Y2为LCD原点值,Y1为终点值

55 与触摸屏有关的函数: TchScr_init 定义:void TchScr_init() 功能:初始化设置触摸屏,系统启动初始化硬件的时候调用。包括,触摸屏的读写芯片和接口 TchScr_GetScrXY 定义:void TchScr_GetScrXY(int *x, int *y) 功能:获得触摸屏的坐标 参数说明: x,y:触摸屏的坐标的指针。

56 触摸屏的驱动 #define ADS7843_CTRL_START 0x80 #define ADS7843_GET_X 0x50
#define ADS7843_GET_Y 0x10 #define ADS7843_CTRL_12MODE 0x0 #define ADS7843_CTRL_8MODE 0x8 #define ADS7843_CTRL_SER 0x4 #define ADS7843_CTRL_DFR 0x0 #define ADS7843_CTRL_DISPWD 0x3 // Disable power down #define ADS7843_CTRL_ENPWD 0x0 // enable power down #define ADS7843_PIN_CS (1<<6) //GPF6 #define ADS7843_PIN_PEN (1<<5) //GPG5 //#define ADS7843_PIN_BUSY (1<<6) /////////触摸屏动作//////// #define TCHSCR_ACTION_NULL 0 #define TCHSCR_ACTION_CLICK 1 //触摸屏单击 #define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击 #define TCHSCR_ACTION_DOWN 3 //触摸屏按下 #define TCHSCR_ACTION_UP 4 //触摸屏抬起 #define TCHSCR_ACTION_MOVE 5 //触摸屏移动 #define TCHSCR_IsPenNotDown() (rPDATG&ADS7843_PIN_PEN) void TchScr_init(void); void TchScr_GetScrXY(int *x, int *y);

57 函数TchScrGetScrXY(int *x, int *y)的结构

58 A/D接口及采样实现

59 A/D转换器是摸拟信号源和CPU之间联系的接口,它的任务是将连续变化的摸拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。 ARM S3C440BX芯片自带一个8路10位A/D转换器,该转换器可以通过软件设置为Sleep摸式,可以节电减少功率损失,最大转换率为500K,非线性度为正负1位。 其转换时间可以通过下式计算:如果系统时钟为66MHz,比例值为9,则为 66MHz/2 (9+1)/16 (完成转换至少需要16个时钟周期)=205.25KHz(相当于4.85us)

60 与AD相关的寄存器主要是如下三个: ADCPSR:采样比率寄存器。 通过设置该寄存器,可以设置采样率,最后得到的除数因子 =2(寄存器值+1)。 ADCDAT:转换结果数据寄存器。该寄存器的十位表示转换后的结果,全为1时为满量程3.3伏。

61 ⑴           ADCCON:采样控制寄存器。其地址和意义参见下表:
该寄存器的0位是转换使能位,写1表示转换开始。1位是读操作使能转换,写1表示转换在读操作时开始。2、3、4位是通道号。5位为睡眠摸式设定,6位为转换标志位(只读)。 rADCCON=0x11(通道4开始转换)

62 初始化函数: void init_ADdevice() { rADCPSR=20; //采样率为32 rADCCON=ADCCON_SLEEP;//进入休眠摸式 } 读取某路摸拟量函数: int GetADresult(int channel) //channel为通道数 rADCCON=(channel<<2)|ADCCON_ENABLE_START; //启动某路转换 while(!(rADCCON&ADCCON_FLAG));   //直到转换完毕 return rADCDAT; //返回转换结果

63 主函数如下: int Main(int argc, char **argv) { int i; float d=1024;
init_ADdevice(); Uart_Printf("\n"); while(1) for(i=0;i<=7;i++) d=GetADresult(i)*5.00/1024; Uart_Printf("a%d=%f\n",i,d); Delay(10000); } return 0;

64 带操作系统的A/D功能实现 当系统内嵌入操作系统时,由于相当部分的工作已经被系统执行,甚至包括串行口的初始化工作,所以A/D功能的实现变得更加容易,下面我们看看如何周期性采集某路通道的信号,并在LCD上显示该信号的波形。 void AD_Check_Task(void *Id) { int i=0; float d; int oldx,oldy; PDC ADpdc; ADpdc=CreateDC(); init_ADdevice(); SetDrawOrg(ADpdc, 0,LCDHEIGHT, &oldx, & oldy); //设置原点

65 while(1) { if(ADOpen) //AD采集开关,按4键有效 {d=GetADresult(0)*3.3/1024;//采集数据,并处理 //在屏幕上展开显示采集曲线 if(i>=LCDWIDTH-1) { i=0; ClearScreen(); } OSSemPend(Lcd_Disp_Sem,0, &err);//得到信号量 SetPixel(ADpdc,i,(int)(-d*LCDHEIGHT/3.3),ADpdc->PenColor); OSMboxPost(LCDFresh_MBox,(void*)1); //刷新LCD OSSemPost(Lcd_Disp_Sem);//发送信号量 i++; } else //AD 开关:关 { ClearScreen(); i=0; } OSTimeDly(10); } }

66 在Main_Task中添加消息响应部分,通过设置某个全局变量,当按键盘上的某个键时(如nkey==4),变量改变,决定是否继续采集。键盘响应函数为:
void onKey(int nkey, int fnkey) { if(nkey==4) if(ADOpen==True) ADOpen=False; else ADOpen=True; } A/D转换任务在执行时,将检测ADOpen变量,判断是否开启转换。

67 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

68 以太网接口的基本知识 1、传输编码 曼彻斯特编码 差分曼彻斯特编码

69 以太网协议 以太网MAC层物理传输帧 (IEEE802.3 ) PR: 同步位,收发双方的时钟同步,也指明传输的速率(10M、100M)
SD DA SA TYPE DATA PAD FCS 56位 8位 48位 16位 不超过1500字节 可选 32位 PR: 同步位,收发双方的时钟同步,也指明传输的速率(10M、100M) SD: 分隔位,表示下面跟着的是真正的数据,而不是同步时钟 DA: 目的地址,以太网的地址为48位地址。如果为都为F,则是广播地址 SA: 源地址,48位,表明该帧的数据是哪个网卡发的,即发送端网卡地址 TYPE:类型字段,表明该帧的数据是什么类型。如:0800H 表示数据为IP 包,0806H表示数据为ARP包,814CH是SNMP包,8137H为IPX/SPX包 DATA:数据段,该段数据不能超过1500字节。 PAD: 填充位。以太网帧传输的数据包最小不能小于60字节, 当数据段不 足46字节时,后面补 (当然也可以补其它值) FCS: 32位CRC数据校验位。该校验由网卡自动完成

70 以太网的数据传输特点 PR,SD,PAD,FCS这几个数据段是由网卡自动产生的;只需要理解DA、SA、TYPE、DATA四个段的内容
所有数据位的传输由低位开始(传输的位流使用曼彻斯特编码) 以太网的冲突退避算法是由硬件自动执行的 DA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节 以太网卡可以接收三种地址的数据,一个是广播地位,一个是多播地址(在嵌入式的环境中一般不用),一个是它自已的地址 任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配。

71 嵌入式的以太网方案 嵌入式处理器+网卡芯片(RTL8019) 带有以太网络接口的嵌入式处理器 对嵌入式处理器没有特殊要求,通用性强
处理器和网络数据交换通过外部总线,速度慢,不适合于100M网络 带有以太网络接口的嵌入式处理器 处理器面向网络应用 处理器和网络数据交换通过内部总线,速度快

72 RTL8019的原理框图

73 嵌入式网络接口的特点 与常规的网卡设计思路不同的是,在嵌入式系统中,系统的精简一直是个主要的原则。RTL8019AS作为网卡,时需要一片EEPROM作为配置存储器,来确定通讯的端口地址,中断地址,网卡的物理地址,工作模式,制造厂商等信息; 而在嵌入式系统中,可以使用RTL8019AS的默认配置和一些管脚作为网卡的初始化方法。这样可以节省配置存储器,减小嵌入式硬件平台的体积。

74 基于RTL8019在嵌入式以太网设计 1 RTL8019AS的初始化
RTL8019支持即插即用模式和非即插即用模式。在嵌入式系统中,网卡的外设通常是不经常插拔的,所以,为了系统的精简,配置RTL8019为非即插即用模式。有着固定的中断,有着固定的端口地址,假设是端口是0x300(这里的端口是相对于ISA总线来说的端口,对于ARM的总线,需要重新计算地址)。这些配置可以通过RTL8019的外部管脚,在系统上电复位的时候,自动配置起来。

75 关于RTL8019的RAM RTL8019含有16K字节的RAM,地址为0x4000-0x7fff(指的是RTL8019内部的存储地址,是RTL8019工作用的存储器,可以通过远程DMA访问),每256个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x40--0x7f。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包

76 2 通过RTL8019AS发送数据 作为一个集成的以太网芯片,数据的发送校验,总线数据包的碰撞检测与避免是由芯片自己完成的。我们只需要配置发送数据的物理层地址的源地址、目的地址、数据包类型以及发送的数据就可以了。

77 3、通过RTL8019AS接收数据 在RTL8019的初始化程序中已经设置好了接收缓冲区的位置,并且配置好了中断的模式。当有一个正确的数据包到达的时候,RTL8019会产生一个中断信号,在ARM中断处理程序中,接收数据。 数据的接收比较简单,即通过远端DMA把数据从RTL8019的RAM空间读回ARM中处理。

78 TCP/IP 协议的层次 应用层(Application) BSD套接字(BSD Sockets) 传输层 (Transport)
TCP、UDP 网络层 (Network) IP、ARP、ICMP、IGMP 数据链路层(Data Link) IEEE802.3 Ethernet MAC 物理层 (Physical)

79 嵌入式以太网中主要处理的协议 ARP(Address Resolation Protocol) 地址解析协议
ICMP (Internet Control Messages Protocol) 网络控制报文协议 IP(Internet Protocol) 网际协议 TCP(Transfer Control Protocol) 传输控制协议 UDP(User Datagram Protocol) 用户数据包协议

80 ARP地址解析协议 网络层用32 bit的IP地址来标识不同的主机,而链路层使用48 bit的物理(MAC)地址来标识不同的以太网接口。只知道目的主机的IP地址并不能发送数据帧给它,必须知道目的主机网络接口的MAC地址才能发送数据帧。 ARP的功能是实现从IP地址到对应物理地址的转换。 源主机发送一份包含目的主机IP地址的ARP请求数据帧给网上的每个主机,称作ARP广播,目的主机的ARP收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个包含目的主机IP地址及对应的MAC地址的ARP回答给源主机。 每台主机上都有一个ARP高速缓存,存放最近的IP地址到硬件地址之间的映射记录。通常每一项的生存时间为20分钟

81 ICMP网络控制报文协议 IP层的附属协议,IP层用它来与其他主机或路由器交换错误报文和其他重要控制信息。
两个实用的网络诊断工具,Ping和Traceroute(Tracert),都是利用该协议工作的。

82 IP网际协议 IP工作在网络层,是TCP/IP协议族中最为核心的协议。所有的TCP,UDP,ICMP以及IGMP数据都以IP数据包格式传输。
IP数据包最长可达65535字节,其中报头占32 bit的数目。包含各32 bit的源IP地址和目的IP地址。在嵌入式应用中,简化设计,IP数据包长度等于数据链路层的数据长度。

83 TCP传输控制协议 TCP是一个面向连接的可靠的传输层协议。TCP为两台主机提供高可靠性的端到端数据通信。主要包括:

84 UDP协议 UDP是一种无连接不可靠的传输层协议。

85 关于端口 TCP和UDP采用16位的端口号来识别上层的TCP用户,即上层应用协议如FTP,TELNET等。
常见的TCP/IP服务都用1-255之间的端口号。例如FTP服务的TCP端口号都是21,Telnet服务的TCP端口号都是23 256-1023之间的端口号通常都是提供一些特定的Unix服务 TCP/IP临时端口分配1024-5000之间的端口号

86 基于ARM和uCOS-II的TCP/IP协议
向ARM和uC/OS移植一个TCP/IP协议栈 采用uC/OS自带的TCP/IP协议栈

87 BSD套接字(BSD Sockets) BSD Sockets使用的最广泛的网络程序编程方法,主要用于应用程序的编写,用于网络上主机与主机之间的相互通信 UNIX,Linux,VxWorks均支持BSD Sockets,Windows的Winsock基本上是来自BSD Sockets Socket分为Stream Sockets和Data Sockets Stream Sockets是可靠性的双向数据传输,使用TCP协议 Data Sockets是不可靠连接,使用UDP协议

88 套接字的使用 UDP服务器端和一个UDP客户端通信的程序过程
创建一个Socket sFd =socket (AF_INET, SOCK_DGRAM, 0) 把Socket和本机的IP,UDP口绑定 bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) 循环等待,接收(recvfrom)或者发送(sendfrom)信息 关闭Socket,通信终止 close (sFd)

89 本节提要 1 基于ARM的硬件系统体系结构 2 存储器接口设计 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6
其它通讯接口设计

90 CAN总线设计

91 CAN总线接口设计 Controller Area Network,控制器局域网,现场总线之一。
是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。 主要应用于汽车电控制系统、电梯控制系统、安全监控系统、医疗仪器、纺织机械、船舶运输等方面 CiA(CAN in Automation)为全球应用CAN技术的权威。

92 CAN总线特点 低成本 远距离传输(长达10Km) 高速的数据传输速率(高达1Mbit/s) 可根据报文的ID决定接收或屏蔽该报文
可靠的错误处理和检错机制 发送的信息遭到破坏后,可自动重发 节点在错误严重的情况下具有自动退出总线的功能

93 CAN总线控制器体系结构 总线接口 协议控制器 状态/控制 寄存器 宿主机 接口 CAN总线 消息对象 接收缓冲区

94 CAN总线扩展芯片 SJA1000——Philips 82C250 TJA1050
独立CAN控制器,替代82C200,支持CAN2.0A/B,同时支持11位和29位ID,位速率可达1M,具有总线仲裁功能,扩展的接收缓冲器(64字节、先进先出FIFO),增强的环境温度范围( ℃)。 82C250 CAN总线收发器, 是CAN协议控制器和物理总线之间的接口,该器件对总线提供差动发送能力并对CAN控制器提供差动额接收能力,有很强的抗电磁干扰(EMI)的能力 ,至少可挂110个节点。 TJA1050 替代82C250产品,电磁辐射更低 ,无待机模式

95 uCOS-II下的驱动程序 uCOS-II没有给驱动程序提供统一的标准接口 任何在系统中对于硬件的管理都可以称为uCOS的驱动程序

96 驱动程序抽象层 操作系统只和特定的驱动抽象层通讯,无论在抽象层下面对应的是什么类型的设备,对操作系统和用户的应用程序来说都是统一的接口。
通过使用C语言的指针函数的方法,实现了驱动抽象层的软件设计。通过指向不同驱动子程序的函数指针,为同一操作系统挂载了多种驱动程序。

97 uCOS-II中CAN总线驱动程序结构

98 uCOS-II中CAN总线驱动程序剖析 在can.h中定义CAN总线驱动程序的结构 can_driver_t
通过全局数组can_driver挂载CAN总线驱动 CAN总线的抽象层在can.c中实现 驱动程序在mcp2510.c中实现 系统的启动与驱动程序的加载过程

99 谢谢!


Download ppt "嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计."

Similar presentations


Ads by Google