嵌入式之通信协议总结(从Uart、I2C和SPI入手)

最近在学习2440的时候,做了一些通信协议方面的实验。横向着做一总结。

本篇总结总一下几个方面叙述:
1、何为协议,何为通信协议?
2、何为串行、何为并行?
3、何为同步、何为异步?
4、何为数据的采样和输出(时序问题)?
5、其他

一、何为协议,何为通信协议?

  所谓协议,简单来说就是一群人事先定好的标准,大家都按照这个标准来,这样,大家说出来的话,做出来的东西,发出来的数据就可以被其他人理解。所以,广义上说,协议存在于生活的方方面面。在计算机系统中,协议也分为软件协议和硬件标准等等。
  计算机系统中的通信协议是计算机协议的一种,它的目标是使接受双方(或多方)能够正确“理解“并传输想要“交流”的数据。不同的通信协议具有不同的特点,它们能提供不同的通信效率,同时也需要不同的软硬件设施。 这里要讨论的Uart、I2C和SPI就是用于计算机系统中的有线通信协议。

二、何为串行、何为并行?

  一般来说,通信协议中有几个标准。串并行就是其中的一个。所谓串行通信,就是基本数据并不是一下都发送完毕,而是分时发送,一次发送基本数据的一部分。而并行通信,就是一次发送完一整个基本数据。
  对于并行通信,其发送效率较高,一次即可发送一个基本数据。但是需要较高的硬件通信成本,即数据线路。比如:一个8位的并行通信系统,其最少需要8根数据线进行同步通信。
  对于串行通信,其发送效率没有前者高,但是其布线成本较低。同样的8位串行通信系统,其最少只需要一根线就可以把数据一位一位的发送完毕(不考虑信号同步等线)。
  这里要注意的是,以上区分串行、并行通信的一个重要概念:基本数据。所谓基本数据,就是需要发送的一个最小单元,也就是通信双方约定的最小数据单元,一般为8位、16位、32位等。
  区分并行和串行的重点是基本数据单元和数据线的宽度。并不能认为只有一根数据线的就是串行通信,没准它的数据单元就是一个bit。也不能认为有8根数据线的就是并行通信,没准它的基本传输单元是64位。
对于普通的Uart、I2C和SPI来说,他们都是串行通信,因为它们的数据线都只有1位(只考虑单方向),而它们的传输单元一般都超过1位。
  总的来说,串行通信是那时间来换空间的一种通信手段。

三、同步、何为异步?

  通信协议中还有一个标准,就是异步和同步。同步指的是通信双方按照一个基准进行发送和接受数据。异步就是通信双方按照各自不同的基准进行数据传输。
咳咳,敲黑板了。。。
  异步通信只是各自的基准不一样,并不是没有各自的基准。高大上一点说是同步信号。注意,一般来说,只要是通信都需要同步信号,用来协调数据传输,简单来说,就是辨别从哪到哪是一位数据。
  一般来说,同步通信采用时钟信号作为基准(同步信号),I2C的SCL、SPI的SCK时钟信号。而异步通信有的采用单位时间(通过事先约定好的波特率),如Uart,也有的采用发送特定的同步数据帧(_,这个我一时没想到例子)。
所以,Uart是异步通信,I2C和SPI是同步通信。

四、何为数据的采样和输出(时序问题)?

  对于同步通信来说(一般就是有时钟信号的),其协议的一个重点就是何时进行数据的采样和输出。所谓采样,简单来说,就是什么时候从总线上取得数据。所谓输出,就是什么时候把数据输出到总线上。要注意,这两个不是一回事。(┭┮﹏┭┮,我就在这上面花了好长好长的时间)
  对于I2C来说,其数据传输时的协议是:SCL为高电平是,SDA保持不变。SCL为低电平时,SDA可以改变。换句话说,就是在时钟信号的上升沿进行数据的采样,即可以从SDA上读取数据。在时钟的下降沿进行数据的传输,即把SDA值发送到总线上。
  对于SPI来说,其提供了时钟极性和时钟相位的机制,可以通过这种方式有用户进行选择何时采样、何时输出,不过一般使用SPI模式0和模式3。(这么巧,模式0和模式3也是上升沿采样,下降沿输出,里面有蹊跷,我现在还不知道。)

五、其他

1、关于存储器写入:一般来说,存储器的写入花费的时间都比读出的时间长。有可能会达到ms级别,这一点在编程时要注意,适当延时。(┭┮﹏┭┮,我就在这上面也花了好长好长的时间)

啊,好,没了就到这吧。

注:以上是我自己学习总结所得,未经仔细考证。若有错误,希望指正。

说明: 除非特别声明,所有程序均使用VC++6.0 MFC编写。 所有程序均为练手用,放弃一切权利,同时不承担任何责任。 显式遵照 GPL v3.0标准。 QuoteCorrection 20110722 1119.7z 处理 清风徐来 水波不兴 邮件使用,将 西文 "" 转换为 “” 原理:ASC 转 UNICODE(修改) 转 ASC。 处理文件夹。 CSourceCodeEdit X4括号判断末行 20110721 1216.7z C语言源代码格式化。 处理文件夹。 PLT2KMLX14解决最后一行的问题 20110721 0931.7z PLT2KML 改CString完工 20120731 1632.7z PLT2KML 20110811 1047 处理单文件.7z PLT2KML 20120813 1815 处理子目录.7z PLT2KML 20120831 0934 处理子目录.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPT2KML 改CString完工 20120731 1700.7z WPT2KML 全部改CString慢 改strcat慢 20120801 1338.7z WPT2KML 全部改CString慢 改strcat慢 20120801 1559.7z WPT2KML 完成 20120802 1718.7z WPTPLT2KMLx12PLTWPT初步 20110721 1006.7z WPTPLT2KML 基本完工 20120801 1618.7z WPTPLT2KML 删除原始PLTWPT文件 20120802 0908.7z WPTPLT2KML 修正WPT 20120802 1725.7z OZI格式的轨迹文件转KML格式的轨迹文件。 原理:ASC(转换) 转 UNICODE 转 UTF-8。 处理子目录 WPT完成CFile改造成CreateFile SubtitleENCN 20110726 1924.7z 剔除中英文字幕中的中文。 原理:ASC 转 UNICODE(剔除中文) 回转ASC。 StringArrayBuildX10排版完成 20110728 0853.7z UNICODE 0-65535 中汉字的拼音。 从 CnToSpell.java 中提取的拼音。 StringArrayX6汉字转拼音 20110729 1418 拼音库需要修正.7z 汉字转拼音 原理:ASC 转 UNICODE(汉字转拼音) 回转ASC。 TXTEditEnterX1单文件排版 20110729 1902.7z 排版用 原理:ASC 转 UNICODE(排版) 回转ASC(替换掉原来的文件)。 doyouhikeList 磨房报名人员ID格式化后发悄悄话 20110729 1856.7z 磨房报名人员ID格式化后发悄悄话 原理:ASC 转 UNICODE(排版) 回转ASC(替换掉原来的文件)。 DOC2TXTEdit 20110919 1753.7z 处理PDF的文件转TXT后的换行问题。==末尾是空格不用处理的。 原理:ASC 转 UNICODE(行的结尾只要不是汉字就换行) 回转ASC。 PLTClear 清除PLT文件夹的名 20111006 1912.7z 处理 GPX转PLT之后, OziExplorer Track Point File Version 2.1 WGS 84 Altitude is in Feet Reserved 3 0,2,255, $$$$$$ ,0,0,2,8421376 文件名会显示在 GM 做的地图里。清除掉 原理:ASC 转 UNICODE(修改) 转 ASC。 处理文件夹。 AngleBracketsSubtitle 20111006 1935.7z 处理 清除字幕中的字体、颜色标记。 原理:ASC 转 UNICODE(修改) 转 ASC。 处理文件夹。 UTF82ANSI 20111006 2008.7z 处理 将 UTF-8 格式的 字幕(或者文件) 转 ANSI 格式。 原理:UTF-8 2 UNICODE 2 ANSI。 处理文件夹。 GPX2KML 20120102 1630.7z 处理 将 UTF-8 格式的 字幕(或者文件) 转 ANSI 格式。 原理:查找坐标点, 然后由ANSI 2 UNICODE 2 UTF-8。 处理文件夹。 <trkpt lat="36.409595000" lon="114.187676000"> <ele>258.000000</ele> <time>2011-03-08T08:20:31Z</time> <speed>3.666667</speed> </trkpt> FileFolderGenerate 20120112 1514.7z 文件夹生成函数CreateDirectory的测试。 功能:在指定目录下生成256个文件夹,每个文件夹内生成256个32K的文本文件,内容为“A”。 FileGenerate 20111121 1641.7z 功能: 猜想:对于“8.3格式文件”的文件名,(也许是出于向后兼容的目的),操作系统总是尝试以“大写”的文件名保存,小写的文件名或者扩展名也用大写表示,然后在“文件登记项”的32B的第13个字节(偏移量为0x0C)标识。于是检验大小写文件名对可创建的文件数量的影响。 还是将电脑的最后一个分区格式化为 FAT32 格式。(为了保证一般性,不是在“根目录下”检验的,相信也同样适合于根目录。) 然后使用如下四种读写文件的方法进行测试, 1、C语言函数fopen(),UNICODE版本是 _wfopen()。 2、C++ fstream 3、mfc CFile、CStdioFile类 4、采用WinCE的API CreateFile 其中每种方式都检测9种情况: 文件名大写.扩展名大写(B1)、文件名大写.扩展名小写(B2)、文件名大写.扩展名混写(B3) 文件名小写.扩展名大写(B4)、文件名小写.扩展名小写(B5)、文件名小写.扩展名混写(B6) 文件名混写.扩展名大写(B7)、文件名混写.扩展名小写(B8)、文件名混写.扩展名混写(B9) shuangseqiu 20120226 1931.7z shuangseqiu 双色球 20120802 1728.7z shuangseqiu 清注释完成20120810 1049.7z 功能: 寻找双色球的蓝球的间隔规律。 单文件处理。 CreateFile读取文件并进行处理。 CreateFile写入文件,以供分析之用。 FileNumber 20111028 2219.7z 功能: 给文件编号。(文件有遗漏。) CreateFile读取文件。 CFile写入文件。(==修正为CreateFile) !!!!KMLPointReverse 20111006 2205.7z !!!!KMLPointReverse 20120831 0951.7z 功能: 编辑KML格式的GPS轨迹的时候,将轨迹点前后倒置! CSourceCodeEnter 20120229 1759.7z 由 CSourceCodeEdit X4括号判断末行 20110721 1216.7z 简单修正而得!加入了对“#”的处理。(很多编辑器、很多人喜欢用回车而不喜欢用换行符号!) C语言源代码格式化。 处理文件夹。 CSourceCodeEnterFile 20120611 0914.7z 处理文件 CSourceCodeEnterFile WriteFile 20120713 0930.7z CSourceCodeEnterFile WriteFile TRUNCATE_EXISTING 20120718 0938.7z Comma2Enter 20120614 1626.7z 将????分隔的文本文件改为回车换行分隔。 处理文件。 rgb32bmpFile 640x480 20120713 1331.7z 640x480转BMP文件 处理单文件 RGB32BMP 20120713 1347.7z 640x480转BMP文件 处理文件夹 EXTnamebig2small 扩展名更改-外部申请内存块 b2s s2b 20120718 1344.7z 文件名扩展的大写←→小写转换。 递归调用处理子目录 YUYV2BMP 20120723 1109 算法1.7z YUYV的数据转换成RGB的数据成功 递归调用处理子目录 BrowseDirectoryTree 20120718 1026.7z ListAllFileInDrectory 20120723 1317.7z 子目录浏览 nst2kml 20120802 1925.7z 处理子目录 AddQuote 20120810 1016.7z a → 'a'; 处理单文件 kmlA2Space 20120813 1124.7z kmlA2Space 20120813 2345.7z 功能:将Ourxmaps生成的以0x0A分隔的KML文件转化为空格分隔的KML文件 UTF8 转 UNICODE 转 ANSI之后进行处理,处理完之后,ANSI 转 UNICODE 转 UTF-8 保存。 处理子目录 A2DA 20120831 0939.7z DA2A 20120831 0939.7z 功能:单文件处理,WINDOWS/LINUX下的回车换行的处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值