范文一:[资料]i2c总线接口电路设计
2FPGA与IC总线器件接口电路设计
22利用FPGA模拟IC总线协议对IC总线接口器件AT24C256 进行读写操作。利用按键输入读写命
令和相应的地址、数据,对芯片进行读写操作,读写的数据用数码管显示。
2一、IC总线接口电路设计分析
21. IC 总线协议
22IC 总线的两根通信线,一根是串行数据线SDA,另一根是串行时钟线SCL。多个符合IC总线标
2准的器件都可以通过同一条IC总线进行通信,而不需要额外的地址译码器。每个连接到总线上的器件
2都有一个唯一的地址作为识别的标志,都可以发送或接收数据。IC 总线通信速率受主机控制,标准模
式下可达100kbit/s。 2一般具有IC总线的器件其SDA、SCL引脚都为集电极(或漏极)开路结构。因此实际使用时,SDA
2和SCL信号线必须加3~10K的上拉电阻。总线空闲时均保持高平。IC总线接法如图1所示。
VCC
SDA
主机 SCL
SDA SCL SDA SCL SDA SCL
… 从机1 从机2 从机n
图1 I2C总线连接示意图
2(1) IC的主机和从机,发送器和接收器
2产生IC总线时钟信号和起始、停止控制信号的器件,称为主机,被主机寻址的器件称为从机。
22任何将数据传送到IC总线的器件称为发送器,任何从IC总线接收数据的器件称为接收器。
主机和从机都可作为发送数据器件和接收数据器件。
2(2) IC 总线上数据的有效性:
时钟线SCL为高电平时,数据线SDA的任何电平变化将被看作总线的起始或停止信号;
在数据传送过程中,当时钟线SCL为高电平时,数据线SDA必须保持稳定状态,不允许有跳变;数据线SDA的状态只能在SCL低电平期间才能改变。即进行串行传送数据时,在SCL高电平期间传送位数据,低电平期间准备数据。
(3) 从机地址 222 IC总线不需要额外的片选信号或地址译码。多个IC总线接口器件可连接到一条IC总线上,它们之间通过地址来区分。主机是主控制器件,只有一个主机的不需要地址。其它器件均为从机,均有器
2件地址,但必须保证同一条IC总线上的器件地址不能重复。一般从机地址由7位地址位和1位读写位组成,地址位为高7位,读写位为最低位。读写位为0时,表示主机将向从机写入数据;读写位为1时,表示主机将要从从机读取数据。 2(4) IC 总线的通信时序
2IC 总线的通信时序如图2所示。
SDA
ACK ACK
应答 应答
SCL
1 2 7 8 9 1 2
P 总线 S 停止 起始 暂停 条件 条件 控制
停止
条件
图2 I2C 总线的通信时序
? 首先主机发送一个起始信号。当时钟线SCL处于高电平期间,数据线SDA电平从高到低的跳22变形成IC总线的起始信号,启动IC总线。
? 主机逐位发送7位(高位在前,低位在后)从机地址和1位读写控制信号,共8位。需8个时钟。
? 与传送地址一致的从机发应答信号(ACK)。在第9个时钟周期时将SDA线拉低表示其已收到一个8位数据。若在第9个时钟周期,SDA为高电平时为非应答。
? 开始传送数据,传送数据数量不限。每个字节(8位)后紧跟1个接收器件发出的应答位。若是主机读取从机数据时,从机发送数据,主机发应答位;若是主机写数据到从机时,主机发送数据,从机发应答位。
? 数据传输结束时,主机发送1个停止信号,当时钟线SCL为高电平时,数据线SDA由低电平
2变为高电平时形成终止信号,停止IC总线通信。
(5) 数据传输基本格式如表1。
表1 I2C总线数据传输基本格式
S A7~A1 R/W ACK D7~D0 ACK D7~D0 ASK P
起应 应答应答位 停 7位 0:写 8位 8位 …
始地址 答 数据 位 数据 止 1:读 0:应答
位 位 位 1:非应答
其中S、A7~A1、R/W、P总是由主机产生;写数据时,ACK由从机产生,D7~D0由主机产生;读数据时,ACK由主机产生,D7~D0由从机产生。
2. I2C总线器件AT24C256
22AT24C256 是一个256K 位的串行CMOS型 EPROM, 可存储32768 个字节。该器件通过IC总线接口进行操作,其引脚如图3所示,各引脚功能见表2。
图3 AT24C256引脚图
表2 AT24C256引脚功能说明
管脚名称 功能说明
SCL AT24C256 串行时钟输入管脚。用于产生器件所有数据发送或接收的时钟,是输入管脚。
双向串行数据/地址管脚。用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚SDA 可与其它开漏输出或集电极开路输出进行线或wire-OR。
写保护。当WP 脚连接到Vcc ,所有内存变成写保护只能读;当WP 引脚连接到Vss 或WP 悬空,允许器件进行读/写操作。
器件地址输入。这些管脚为硬连线或者不连接,对于单总线系统最多可寻址4 个A0 A1 AT24C256器件。当这些引脚没有连接时其默认值为0。
电源地 VSS
VCC 1.8~6V
空脚 NC
2作为带有IC总线接口的器件,每个AT24C256都有一个7位的从机地址,其高5 位固定为“10100”,接下来的2 位由AT24C256的引脚A1 A0 硬连线输入决定(A1、A0直接接电源VCC或GND),同一I2C总线上最多可以连接4 个AT24C256器件。AT24C256除了有作为从机的地址,其内部还有作为存储单元的编码子地址,其子地址为双字节(16位),从0000H~7FFFH。本设计中只有1 个AT24C256,可将AT24C256的引脚A1、 A0直接接地,其硬件电路如图4所示。则该AT24C256作为从机的7位地址为“1010000”。
图4 单个AT24C256连接电路图
3. 对AT24C256的读写过程
(1) 向AT24C256某一存储单元写入1个字节数据,过程如下:
? 主机(这里为FPGA控制器)发送一个起始信号,启动发送过程;
? 主机发送7 位从机地址(这里为1010000)和1位写控制位(为0);
? 从机(这里为AT24C256)发应答位。在主机发送起始信号和从机地址字节后,AT24C256 监视总线并当其地址与发送的从地址相符时,响应一个应答信号。在第9个时钟,将SDA 线拉为低电平;
? 主机接收到应答位后,发从机子地址高8位(为AT24C256某一存储单元地址)。
? 从机接收完高8位子地址后,发应答位;
? 主机接收到应答位后,发从机子地址低8位; ? 从机接收完低8位子地址后,发应答位;
? 主机接收到应答位后,发送待8位写入数据; ? 从机接收完8数据后,发应答位,并开始内部数据的擦写; ? 主机接收到应答位后,发停止位,结束传送,总线挂起。 SDA上数据传输格式见表3,数据传送时序如图5所示。
表3 向AT24C256写1个数据时总线SDA上数据传输格式
S A7~A1 0 0 AD15~AD8 0 AD7~AD0 0 D7~D0 0/1 P 起写 应 应 应 写入 应 停 7位 高8位 低8位 始器件 答 指针 答 指针 答 答 止 8位 位 地址 位 地址 位 地址 位 数据 位 位
主机发送 从主机发送 从主机发送 从主机发送 从机主
机 机机发送 机
发发发发
送 送 送 送 图5 向
AT24C256写一个数据时序
(2) 从AT24C256某一存储单元读出1个字节数据,过程如下: ? 主机发送一个起始信号,启动发送过程,接着发送7 位从机地址(1010000)和1位写控制位(0);;
? 从机检测到起始信号及本身从地址相符时的从机地址后,发应答位。 ? 主机接收到应答位后,发从机子地址高8位(为AT24C256某一存储单元地址)。
? 从机接收完高8位子地址后,发应答位;
? 主机接收到应答位后,发从机子地址低8位; ? 从机接收完低8位子地址后,发应答位;
? 主机接收到应答位后,再发送一个起始信号(称为重复起始信号),接着再发送7 位从机地址
(1010000)和1位读控制位(为1);
? 从机检测到重复起始信号及从机地址后,发应答位,并将子地址对应的存储单元数据发送到总
线上。
? 主机接收到应答位后,接着准备从总线接收数据,从总线接收完8数据后。发非应答位和发停
止位,结束传送,总线挂起。
SDA上数据传输格式见表4所示,数据传送时序如图6所示。
表4 从AT24C256上读1个数据时总线SDA上数据传输格式
A7 AD15 AD7 A7 D7
S ~ 0 0 ~ 0 ~ 0 Sr ~ 1 0 ~ 0/1 P
A1 AD8 AD0 A1 D0
起 应 应 应 重复 应 读出 非 停 7位 高8位 低8位 7位 始 器件 答 指针 答 指针 答 起始 器件 读 答 应 止 8位 写 位 地址 位 地址 位 地址 位 位 地址 位 数据 答 位
从 主 从 主 从 从 从 主 主
主机 机 机 机 机 机 机 机 机 机 主机发送 发送 发 发 发 发 发 发 发 发 发
送 送 送 送 送 送 送 送 送
图6 从AT24C256读一个数据时序
4. FPGA内部电路
2模拟IC总线对AT24C256的读写控制电路基本结构框图如图7所示。
命令寄存器 位 Scl IO
字节传输总线AT24Sda 传送寄存器 传输控制端口 C256
电路 电路 读写 控制
控制 接收寄存器 电路
接口
标志寄存器 移位寄存器
图7 模拟I2C总线对AT24C256的读写控制框图 2(1) IC总线端口 2IC总线端口为三态输出,当使能端有效时,总线输出为低电平;当使能端无效时三态门输出为高
2阻,但由于IC总线上有上拉电阻,总线保持在高电平或由总线上从机输出数据决定。总线数据始终能
被读入。其结构示意图如图8所示。
Vcc
Sda_en
Sda
Sda
_i Vcc
Scl_en
Scl
Scl_ i
图8 I2C总线端口示意图
(2) 位传输控制模块
2位传输模块以“位”为单位产生各种IC协议命令(开始、停止和重复开始)以及进行位数据读写。为了读写到稳定的“位”数据,读写1位数据分为4到5个阶段完成。1位数据传输时序要求如图9所示。这样内部读写时钟频率一般采用5倍于SCL时钟总线频率。
A B C SCL 开始
SDA
SCL 重复开始
SDA
SCL
停止 SDA
SCL
写 SDA
SCL 读
SDA
图9 I2C协议命令和位数据传输的执行时序
位传输控制电路根据输入的控制命令,将来自字控制模块的一位待写入的数据送到总线上,或从总线上读入一位数据给字控制模块。当完成1位数据传输时产生读写完成标志,并根据数据传输情况产生忙标志和总线仲裁丢失标志。
(3) 字传输控制模块 2字节传输模块以字节为单位控制IC总线的数据传输。该模块根据输入控制命令,将存放在发送寄
2存器中的数据加载到一个移位寄存器,然后逐位发送到位传输模块,再控制位传输模块将数据发送到IC总线上。或控制位传输模块从总线上逐位接收位数据,暂存到移位寄存器,再转换成字节数据送给数据输出。同时给出相关传输标志。
(4) AT24C256读写控制
根据输入控制信号和来自位传输模块的反馈标志,将控制信号加到命令寄存器,给字节传输模块提供控制信号;将输入数据或指定单元地址加载到数据传送寄存器;将从字节模块读取的数据回送到数据接收寄存器。
二、FPGA硬件系统电路设计(略)
2三、IC总线接口电路VHDL设计
1. I2C总线端口
(1) 名称:IIC_IO.vhd
2(2) 功能:IC总线双向端口电路描述 (3) 端口说明
方向 端口名 宽度 说明
数据线三态使能控制端,来自位传输控制模块 Sda_en 1 输入 时钟线三态使能控制端,来自位传输控制模块 Scl_en 1
回送的数据线信号,给位传输控制模块 Sda_i 1 输出 回送的时钟线信号,给位传输控制模块 Scl_i 1
22Sda 1 IC的数据线,外接IC器件 双向 22Scl 1 IC的时钟线,外接IC器件 (4) VHDL描述
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY IIC_IO IS
PORT(
Scl_en,sda_en: IN STD_LOGIC;
Sda,Scl: INOUT STD_LOGIC;
Scl_i,sda_i : OUT STD_LOGIC); END IIC_IO;
ARCHITECTURE one OF IIC_IO IS BEGIN
Sda_i<=sda;>=sda;>
Scl_i<>
Scl<='0' when="" scl_en='0' else="" 'z';="">='0'>
Sda<='0' when="" sda_en='0' else="" 'z';="" end="" one;="">='0'>
2. 位传输控制模块
(1)名称:bit_txd_rxd.vhd
(2)功能:实现位数据或协议命令的传输 (3)端口说明
方向 端口名 宽度 说明
复位信号,低电平复位 Rst 1
系统时钟 clk_sys 1
ena 1 系统使能信号,高电平有效
输入 控制命令,由字节传输模块给出 cmd 4
Bit_data_wr 1 待写入总线的1位数据
总线时钟输入 Scl_i 1
总线数据输入 Sda_i 1
总线时钟输出使能 Scl_oen 1
总线数据输出使能 Sda_oen 1
Bit_finish 1 完成1位读写的标志,1为完成,0为未完成 输出 busy 1 总线忙标志,1为忙,0为闲
lose 1 总线仲裁丢失标志,1为出错,0为正确
Bit_data_rd 1 从总线读出的1位数据 (4) VHDL描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY bit_txd_rxd IS
GENERIC (n:INTEGER:=48);--分频系数
PORT(
Clk_sys: IN STD_LOGIC;
Rst,ena: IN STD_LOGIC;
cmd: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Bit_data_wr: IN STD_LOGIC;--
Scl_i,sda_i : IN STD_LOGIC;
Scl_oen,sda_oen: OUT STD_LOGIC;
Busy,Lose: OUT STD_LOGIC;
Bit_data_rd,Bit_finish: OUT STD_LOGIC);
END bit_txd_rxd;
ARCHITECTURE two OF bit_txd_rxd IS
Type state_t IS (bit_idle,start_a,start_b,start_c,start_d,start_e,stop_a,stop_b,stop_c,stop_d, write_a,
write_b, write_c, write_d,read_a, read_b, read_c, read_d); SIGNAL sta_p: state_t;
CONSTANT n:INTEGER:=48; --产生500KHz的分频系数
SIGNAL en_500k: STD_LOGIC;--500KHz时钟使能信号 SIGNAL Scl_a,Sda_a, Scl_b,Sda_b:STD_LOGIC;--同步SCL和SDA中间信号
SIGNAL scl_edg: STD_LOGIC;--SCL的边沿信号 SIGNAL scl_oen_r, sda_oen_r: STD_LOGIC;--总线使能信号 SIGNAL sda_chk: STD_LOGIC;--写数据时,检查总线信号 SIGNAL dscl_oen,slave_wait: STD_LOGIC;--时钟延迟等待的信号 SIGNAL Sda_S,Sda_P: STD_LOGIC;--启动、停止标志位 SIGNAL Busy_r,Lose_r: STD_LOGIC;--忙标志、丢失标志信号 SIGNAL stop_cmd,stop_cmd_r: STD_LOGIC;--停止命令信号 BEGIN
PROCESS (clk_sys,rst) --同步SCL和SDA的输入信号 BEGIN
IF rst='0' THEN
Scl_a<='1';>='1';>
Sda_a<='1';>='1';>
Scl_b<='1';>='1';>
Sda_b<='1';>='1';>
ELSIF RISING_EDGE(clk_sys) THEN --暂存SCL、SDA的值
Scl_a<= scl_i;="">=>
Sda_a<= sda_i;="">=>
Scl_b<= scl_a;="">=>
Sda_b<= sda_a;="">=>
END IF;
END PROCESS;
Scl_edg<=scl_a and(="" not="" scl_b);--检测时钟scl上升沿="" process="" (clk_sys)="">=scl_a>
BEGIN
IF RISING_EDGE(clk_sys) THEN
IF scl_edg='1' THEN
Bit_data_rd<=sda_a;>=sda_a;>
END IF;
END IF;
END PROCESS;
--从节点未准备好时,下拉SCL延迟周期;当给出的SCL使能为1时,检测SCL总线为0时,则
节点未准备就绪,产生等待信号。
PROCESS (clk_sys)
BEGIN
IF RISING_EDGE(clk_sys) THEN
dscl_oen<=scl_oen_r;>=scl_oen_r;>
END IF;
END PROCESS;
Slave_wait<=dscl_oen and="" (not="" scl_a);="" process="" (clk_sys,rst)="">=dscl_oen>
VARIABLE cnt: INTEGER RANGE 0 TO n-1;--时钟分频计数器
BEGIN
IF rst='0' THEN
cnt:=0;
en_500k<='1';>='1';>
ELSIF RISING_EDGE(clk_sys) THEN
IF clk_cnt
IF ena='1' THEN
cnt:= cnt+1;
en_500k<='0';>='0';>
END IF;
ELSE
IF Slave_wait='0' THEN--从节点准备好,给出时钟使能
cnt:=0;
en_500k<='1';>='1';>
ELSE --从节点未准备好,延迟等待
cnt:= cnt;
en_500k<='0';>='0';>
END IF;
END IF;
END IF;
END PROCESS;
--生成启动标志和停止标志
--在SCL高电平时,检测SDA的下降沿(起始信号),产生启动标志 --在SCL高电平时,检测SDA的上升沿(停止信号),产生停止标志 PROCESS (clk_sys,rst)
BEGIN
IF rst='0' THEN
Sda_S<='0';--启动标志复位>='0';--启动标志复位>
Sda_P<='0';-- 停止标志复位="">='0';-->
ELSIF RISING_EDGE(clk_sys) THEN
Sda_S<=(not sda_a="" )="" and="" sda_b="" and="" scl_a="" ;--生成启动标志="">=(not>
Sda_P<=sda_a and="" (="" not="" sda_b="" )="" and="" scl_a;="" --生成停止标志="">=sda_a>
END IF;
END PROCESS;
--生成总线忙标志
--检测到启动信号发生,但无停止信号发生时表示总线处于忙状态 PROCESS (clk_sys,rst)
BEGIN
IF rst='0' THEN
Busy_r<='0';>='0';>
ELSIF RISING_EDGE(clk_sys) THEN
Busy_r<=(sda_s or="" busy_r)="" and="" (not="" sda_p);="">=(sda_s>
END IF;
END PROCESS;
Busy<=busy_r;--忙标志输出>=busy_r;--忙标志输出>
--产生仲裁丢失标志,
--当没有停止请求时,检测到停止信号,产生仲裁丢失标志 ---当驱动SDA总线为高时,但检测SDA一直为低,产生仲裁丢失标志 PROCESS (clk_sys,rst)
BEGIN
IF rst='0' THEN
stop_cmd<='0';--停止命令信号>='0';--停止命令信号>
stop_cmd_r <='0';>='0';>
Lose_r<='0';>='0';>
ELSIF RISING_EDGE(clk_sys) THEN
IF cmd<= "0010"="" then="" --有停止命令="">=>
stop_Cmd<='1';>='1';>
ELSE
stop_Cmd<='0';>='0';>
END IF;
stop_Cmd_r <= stop_cmd;="">=>
Lose_r<=(sda_p and="" (not="" stop_cmd_r="" ))="" or(not="" sda_a="" and="" sda_chk="" and="">=(sda_p>
sda_oen_r);--丢失标志
END IF;
END PROCESS;
Lose<=lose_r;>=lose_r;>
--位传输状态机
Scl_oen<=scl_oen_r;>=scl_oen_r;>
Sda_oen<=sda_oen_r;>=sda_oen_r;>
PROCESS(clk_sys,rst)
BEGIN
IF rst='0' THEN
Sta_p<=bit_idle;--初始准备状态>=bit_idle;--初始准备状态>
bit_finish<='0'; --1位信号发送或接收完成标志="">='0';>
Scl_oen_r<='1';--时钟输出使能>='1';--时钟输出使能>
Sda_oen_r <='1';--数据输出使能>='1';--数据输出使能>
Sda_chk<='0';--不检查输出>='0';--不检查输出>
ELSIF RISING_EDGE(clk_sys) THEN
IF Lose_r='1' THEN--数据传输信号丢失
Sta_p<=bit_idle;>=bit_idle;>
bit_finish <='0';>='0';>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='1';>='1';>
Sda_chk<='0';>='0';>
ELSE
bit_finish <='0';>='0';>
IF clk_en='1' THEN
CASE sta_p IS
WHEN bit_idle=> --准备状态
Scl_oen_r <=scl_oen_r;--保持scl在同一状态>=scl_oen_r;--保持scl在同一状态>
Sda_oen_r <=sda_oen_r; --保持sda在同一状态="">=sda_oen_r;>
Sda_chk<='0';>='0';>
CASE cmd IS --状态命令字
WHEN "0001"=> sta_p<=start_a;--发送起始信号状态>=start_a;--发送起始信号状态>
WHEN "0010" => sta_p<=stop_a;-- 发送停止信号状态="">=stop_a;-->
WHEN "0100" => sta_p<=write_a;--写入1位数据>=write_a;--写入1位数据>
WHEN "1000" => sta_p<=read_a; --读出1位数据="">=read_a;>
WHEN OTHERS=> sta_p<=bit_idle;>=bit_idle;>
END CASE;
--启动I2C状态,分5个时钟段产生起始信号
WHEN start_a=>
sta_p<=start_b;>=start_b;>
Scl_oen_r <=scl_oen_r; --保持scl="">=scl_oen_r;>
Sda_oen_r <='1'; --sda处于高="">='1';>
Sda_chk<='0'; --不检查输出="">='0';>
WHEN start_b=>
sta_p<=start_c;>=start_c;>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='1';>='1';>
Sda_chk<='0';>='0';>
WHEN start_c=>
sta_p<>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
WHEN start_d=>
sta_p<=start_e;>=start_e;>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
WHEN start_e=> --开始状态5
sta_p<=bit_idle;--回到等待状态>=bit_idle;--回到等待状态>
bit_finish <='1';--起始信号传送完成,给出标志>='1';--起始信号传送完成,给出标志>
Scl_oen_r <='0';>='0';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
--停止I2C状态,分4个时钟段产生停止信号
WHEN stop_a=>
sta_p<=stop_b;>=stop_b;>
Scl_oen_r <='0';>='0';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
WHEN stop_b=>
sta_p<=stop_c;>=stop_c;>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
WHEN stop_c=>
sta_p<=stop_d;>=stop_d;>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='0';>='0';>
Sda_chk<='0';>='0';>
WHEN stop_d=>
sta_p<=bit_idle;>=bit_idle;>
bit_finish <='1';--停止信号传送完成,给出标志>='1';--停止信号传送完成,给出标志>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='1';>='1';>
Sda_chk<='0';>='0';>
--读状态,分4个时钟段读1位信号
WHEN read_a=>
sta_p<= read_b;="">=>
Scl_oen_r <='0'; --="" scl处于低="">='0';>
Sda_oen_r <='1'; --sda由从器件决定="">='1';>
Sda_chk<='0';>='0';>
WHEN read_b=>
sta_p<= read_c;="">=>
Scl_oen_r <>
Sda_oen_r <='1';>='1';>
Sda_chk<='0';>='0';>
WHEN read_c=>
sta_p<= read_d;="">=>
Scl_oen_r <='1';>='1';>
Sda_oen_r <='1';>='1';>
Sda_chk<='0';>='0';>
WHEN read_d=>
sta_p<=bit_idle;>=bit_idle;>
bit_finish <='1';--读完1位数据,给出标志>='1';--读完1位数据,给出标志>
Scl_oen_r <='0';>='0';>
Sda_oen_r <='1';>='1';>
Sda_chk<='0'; --写状态,分4个时钟段写1位信号="">='0';>
WHEN write_a=>
sta_p<= write_b;="">=>
Scl_oen_r <='0'; --="" scl处于低="">='0';>
Sda_oen_r <=bit_data_wr; --输入数据="">=bit_data_wr;>
Sda_chk<='0';>='0';>
WHEN write_b=>
sta_p<=>=>
Scl_oen_r <='1'; --="">='1';>
Sda_oen_r <=bit_data_wr;>=bit_data_wr;>
Sda_chk<='1';-->='1';-->
WHEN write_c=> --写状态3
sta_p<= write_d;="">=>
Scl_oen_r <='1'; --="">='1';>
Sda_oen_r <= bit_data_wr;="">=>
Sda_chk<='1';>='1';>
WHEN write_d=> --写状态4
sta_p<=bit_idle;>=bit_idle;>
bit_finish <='1';--写完1位信号,给出标志>='1';--写完1位信号,给出标志>
Scl_oen_r <='0';>='0';>
Sda_oen_r <= bit_data_wr;="">=>
Sda_chk<='0';>='0';>
WHEN OTHERS=>null;
END CASE;
END IF;
END IF;
END IF;
END PROCESS;
END two;
3. 字传输控制模块
(1)名称:byte_txd_rxd.vhd (2)功能:实现字节数据的传输控制。
(3)端口说明
方向 端口名 宽度 说明
复位信号,外接按钮开关,低电平复位 Rst 1
系统时钟 clk_sys 1
启动命令 start 1
停止命令 stop 1
读命令 read 1
输入 写命令 write 1
应答输入信号 Ack_in 1
Data_txd 8 待发送的8位输入数据或地址,由发送寄存器提供
Bit_data_rd 1 从位模块接收的1位数据
总线仲裁丢失标志 Lose 1
Bit_finish 1 来自位模块的1位传送完成标志
输出命令 cmd 4
向位模块发送的数据 Bit_data_wr 1
输出 Data_rxd 8 接收到的8位数据,送给接收寄存器,
应答完成标志 Ack_finish 1
从总线上读出的应答信号 Ack_out 1
(4) VHDL描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY byte_txd_rxd IS
PORT(
clk_sys: IN STD_LOGIC;
rst: IN STD_LOGIC;
ack_in: IN STD_LOGIC;
data_txd: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
start,stop,write,read: IN STD_LOGIC;
lose: IN STD_LOGIC;
bit_data_rd:IN STD_LOGIC;--从位控制模块读入的一位数据
bit_finish: IN STD_LOGIC;--1位传送完成标志
cmd: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
bit_data_wr:OUT STD_LOGIC;--待写出的位数据
ack_finish,ack_out: OUT STD_LOGIC;
data_rxd: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END byte_txd_rxd;
ARCHITECTURE three OF byte_txd_rxd IS Type state_byte IS (byte_idle,byte_start,byte_stop, byte_write,byte_read,ack_wr,ack_rd);
SIGNAL sta_c: state_byte;
SIGNAL ack_finish_r:STD_LOGIC;--完成1字节数据传输标志 SIGNAL en: STD_LOGIC;--使能信号 SIGNAL ld_en,shift_en:STD_LOGIC;--加载数据使能、移位数据使能
SIGNAL shift_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);--数据移位寄存器
SIGNAL cnt_rw: STD_LOGIC_VECTOR(2 DOWNTO 0);--移位次数计数器
SIGNAL cnt_done: STD_LOGIC;--完成1个字节数据移位完成标志
BEGIN
ack_finish<=ack_finish_r;>=ack_finish_r;>
en<=(read or="" write="" or="" stop)="" and="" (not="" ack_finish_r);--操作使能="" process="" (clk_sys,rst)="" --生成移位寄存器内容="" begin="">=(read>
IF rst='0' THEN
shift_reg<=(others=>'0');
ELSIF RISING_EDGE(clk_sys) THEN
IF ld_en='1' THEN --写数据时
shift_reg<=data_txd;--待发送数据加载到移位寄存器>=data_txd;--待发送数据加载到移位寄存器>
ELSIF shift_en='1' THEN--读数据时
shift_reg<=shift_reg(6 downto="" 0)&="" bit_data_rd;--移位读入数据="">=shift_reg(6>
END IF;
END IF;
END PROCESS;
PROCESS (clk_sys,rst) --进行读写位计数
BEGIN
IF rst='0' THEN
cnt_rw<="000";>="000";>
ELSIF RISING_EDGE(clk_sys) THEN
IF Ld_en='1' THEN --加载新数据时
cnt_rw<="111";--设置计数初值为8次>="111";--设置计数初值为8次>
ELSIF shift_en='1' THEN --移位1次
cnt_rw<=cnt_rw-1;--减1计数>=cnt_rw-1;--减1计数>
END IF;
END IF;
END PROCESS;
cnt_done<='1' when="" cnt_rw="000" else="">='1'>
--字节传送状态控制
PROCESS (clk_sys,rst)
BEGIN
IF rst='0' THEN
cmd<="0000";--i2c总线处于空闲状态命令>="0000";--i2c总线处于空闲状态命令>
bit_data_wr <='0'; --待写出的位数据="">='0';>
ld_en<='0';--禁止加载数据>='0';--禁止加载数据>
shift_en<='0';--禁止移位>='0';--禁止移位>
Sta_c<=byte_idle;--初始准备状态>=byte_idle;--初始准备状态>
sck_finish_r<='0';-- 应答完成标志置0="">='0';-->
sck_out<='0';--应答输出置0>='0';--应答输出置0>
ELSIF RISING_EDGE(clk_sys) THEN
IF Lose='1' THEN--数据传输信号丢失
cmd<="0000";>="0000";>
bit_data_wr <='0';>='0';>
ld_en<='0';>='0';>
shift_en<='0';>='0';>
sta_c<=byte_idle;>=byte_idle;>
ack_finish_r<='0';>='0';>
ack_out<='0';>='0';>
ELSE --
bit_data_wr<=shift_reg(7); --取移位寄存器的最高位作为待写出位="">=shift_reg(7);>
shift_en<='0';--禁止移位>='0';--禁止移位>
ld_en<='0';-- 禁止加载="">='0';-->
ack_finish_r<='0'; --="" 应答完成标志置0="">='0';>
CASE sta_c IS
WHEN Byte_idle=>--空闲状态
IF en='1' THEN--发生读/写/停止命令且无应答完成标志
ld_en<='1'; --重新加载写入数据初值,复位传送计数器="">='1';>
IF start='1' THEN
sta_c<=byte_start;--起始状态>=byte_start;--起始状态>
cmd<= "0001";--启动位模块发送起始位="">=>
ELSIF read='1' THEN
sta_c<=byte_read;--读状态>=byte_read;--读状态>
cmd<= "1000";="" --启动位模块读取1位数据="">=>
ELSIF write='1' THEN
sta_c<=byte_write;--写状态>=byte_write;--写状态>
cmd<="0100" ;="" --启动位模块写入1位数据="">="0100">
ELSE
sta_c<=byte_stop;-- --停止状态="">=byte_stop;-->
cmd<= "0010";="" --启动位模块发送停止位="">=>
ack_finish_r<='1';--产生传送完成标志>='1';--产生传送完成标志>
END IF;
END IF;
WHEN Byte_start=>
IF bit_finish='1' THEN --起始位发送完成标志
ld_en<='1'; --重新加载初值="">='1';>
IF read='1' THEN
sta_c<=byte_read;>=byte_read;>
cmd<="1000";>="1000";>
ELSE
sta_c<=byte_write;>=byte_write;>
cmd<="0100";>="0100";>
END IF;
END IF;
WHEN Byte_write=>
IF bit_finish ='1' THEN --写完1位标志
IF cnt_done='1' THEN--写完8位标志
sta_c<=ack_rd; --读应答状态="">=ack_rd;>
Cmd<="1000";-- 准备读应答位="">="1000";-->
ELSE
sta_c<=byte_write;--保持写状态>=byte_write;--保持写状态>
cmd<= "0100";--准备继续写下1位="">=>
shift_en<='1'; --移位,准备下1位数据="">='1';>
END IF;
END IF;
WHEN Byte_read=>
IF bit_finish ='1' THEN --读完1位标志
shift_en<='1'; --移位,存储新读入的1位数据="">='1';>
IF cnt_done='1' THEN--读完8位标志
sta_c<=ack_wr; --写应答状态="">=ack_wr;>
cmd<= "0100";--="" 准备写应答位="">=>
bit_data_wr<=ack_in;--给出待发送的应答信号>=ack_in;--给出待发送的应答信号>
ELSE
sta_c<=byte_read;--保持读状态>=byte_read;--保持读状态>
Cmd<= "1000";--="" 准备继续读下1位="">=>
END IF;
END IF;
WHEN ack_rd=>--读应答状态
IF bit_finish ='1' THEN --应答位读完成标志
ack_out<=bit_data_rd;--输出应答信号>=bit_data_rd;--输出应答信号>
ack_finish_r<='1'; --给出应答完成标志="">='1';>
data_rxd<=shift_reg;>=shift_reg;>
IF stop='1' THEN
sta_c<=byte_stop;>=byte_stop;>
cmd<= "0010";--发停止位="">=>
ELSE
sta_c<=byte_idle; --空闲状态="">=byte_idle;>
cmd<="0000";--等待>="0000";--等待>
END IF;
END IF;
WHEN ack_wr=>--写应答状态
IF bit_finish ='1' THEN --应答位写完成标志
bit_data_wr<='1';--待写入的位信号为高>='1';--待写入的位信号为高>
ack_finish_r<='1'; --给出应答完成标志="">='1';>
IF stop='1' THEN
sta_c<=byte_stop;>=byte_stop;>
cmd<= "0010";--发停止位="">=>
ELSE
sta_c<=byte_idle; --空闲状态="">=byte_idle;>
cmd<="0000";--等待>="0000";--等待>
END IF;
ELSE
bit_data_wr<=ack_in;>=ack_in;>
END IF;
WHEN Byte_stop=>--停止状态
IF bit_finish='1' THEN --停止位发送完成标志
sta_c<=byte_idle;>=byte_idle;>
Cmd<="0000";--等待>="0000";--等待>
END IF;
END CASE;
END IF;
END IF;
END PROCESS;
END three;
4. AT24C256读写控制
(1) 名称:AT24C256_wr.vhd
2(2) 功能:通过IC总线对AT24C256指定单元进行读写。
(3) 端口说明
方向 端口名 宽度 说明
复位信号,外接按钮开关,低电平复位 Rst 1
系统时钟 clk_sys 1
接口使能信号 ena 1
时钟使能信号 clk_ena 1
读写控制 rw 1
输入 应答值 Ack_flag 1
完成一个字节传输标志 Ack_finish 1
从机地址,送给传输寄存器 Slave_addr 7
从机子地址,送给传输寄存器 Sub_addr 16
从从机读入的数据,送给接收寄存器 Data_rd 8
输入数据,送给传输寄存器 Data_in 8
待写出值,来自传输寄存器 Data_wr 8
Data_out 8 输出数据, 来自接收寄存器
传输完成标志 Rtx_f 1
输出 启动命令,来自命令寄存器 start 1
停止命令,来自命令寄存器 stop 1
读命令,来自命令寄存器 read 1
写命令,来自命令寄存器 write 1
(4) VHDL描述
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY AT24C256_rw IS PORT(
clk_sys: IN STD_LOGIC;--24MHz系统时钟
rst,ena, clk_ena: IN STD_LOGIC;--复位,使能信号
rw: IN STD_LOGIC;
slave_addr: STD_LOGIC_VECTOR(6 DOWNTO 0);
sub_addr:STD_LOGIC_VECTOR(15 DOWNTO 0);
data_in: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ack_finish,ack_flag: IN STD_LOGIC;
data_rxd: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
data_wr: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
start,stop,write,read:OUT STD_LOGIC;
data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
rtx_f: OUT STD_LOGIC);
END AT24C256_rw;
ARCHITECTURE four OF AT24C256_rw IS Type state_at IS (S0,S1,S2,S3,S4,S5,S6);
SIGNAL sta_n: state_at;
SIGNAL cmd_reg: STD_LOGIC_VECTOR(3 DOWNTO 0);--命令寄存器 SIGNAL txd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);--数据发送寄存器
SIGNAL rxd_reg: STD_LOGIC_VECTOR(7 DOWNTO 0);--数据接收寄存器
BEGIN
start<=cmd_reg(0);>=cmd_reg(0);>
stop <>
write <=cmd_reg(2);>=cmd_reg(2);>
read <=cmd_reg(3);>=cmd_reg(3);>
data_wr <=txd_reg;>=txd_reg;>
data_out<=rxd_reg;>=rxd_reg;>
PROCESS(rst,clk_sys)
BEGIN
IF rst='0' THEN
cmd_reg<="0000";--命令寄存器清零>="0000";--命令寄存器清零>
txd_reg<="00000000";--数据传输寄存器清零>="00000000";--数据传输寄存器清零>
Sta_n<=s0;>=s0;>
ELSIF RISING_EDGE(clk_sys) THEN
CASE sta_n IS
WHEN S0=>
IF ena='1' AND clk_ena='1' THEN
Sta_n<=s1;>=s1;>
Cmd_reg<="0101";--给出启动命令,准备写从机地址>="0101";--给出启动命令,准备写从机地址>
txd_reg <=slave_addr&'0'; --给出从机地址,最低位为0="">=slave_addr&'0';>
ELSE
Sta_n<=s0;>=s0;>
cmd_reg <="0000";>="0000";>
END IF;
WHEN S1=>
IF ack_finish='1' THEN--应答完成,1个字节传送完成
IF ack_Flag='1' THEN
cmd_reg <="0010";--非应答,发停止命令>="0010";--非应答,发停止命令>
rtx_f<='0'; --传送失败="">='0';>
Sta_n<=s0;>=s0;>
ELSE --应答
cmd_reg <="0100" ;="" --准备写从机子地址高8位="">="0100">
txd_reg<=sub_addr(15 downto="" 8)="" ;="" --给出从机子地址高8位="">=sub_addr(15>
Sta_n<=s2;>=s2;>
END IF;
ELSE
Sta_n<=s1;>=s1;>
END IF;
WHEN S2=>
IF ack_finish='1' THEN
IF ack_Flag='1' THEN
cmd_reg <="0010";--非应答,发停止命令>="0010";--非应答,发停止命令>
rtx_f<='0'; --传送失败="">='0';>
Sta_n<=s0;>=s0;>
ELSE --应答
cmd_reg <="0100" ;="" --准备写从机子地址低8位="">="0100">
txd_reg<=sub_addr(7 downto="" 0);="" --给出从机子地址低8位="">=sub_addr(7>
Sta_n<>
END IF;
ELSE
Sta_n<=s2;>=s2;>
END IF;
WHEN S3=>
IF ack_finish='1' THEN
IF ack_Flag='1' THEN
cmd_reg <="0010";--非应答,发停止命令>="0010";--非应答,发停止命令>
rtx_f<='0'; --传送失败="">='0';>
Sta_n<=s0;>=s0;>
ELSE --应答
IF rw='0' THEN --向从机写1个数据
cmd_reg <="0100" ;="" --准备写数据="">="0100">
txd_reg<=data_in ;="" --给出待写数据值="">=data_in>
Sta_n<=s4;>=s4;>
ELSE --从从机读1个数据
cmd_reg <="0101";--给出重新启动命令,准备写从机地址>="0101";--给出重新启动命令,准备写从机地址>
txd_reg <=slave_addr &="" '1';="" --给出从机地址,最低位为1="">=slave_addr>
Sta_n<=s5;>=s5;>
END IF;
END IF;
ELSE Sta_n<=s3;>=s3;>
END IF;
WHEN S4=>
IF ack_finish='1' THEN
cmd_reg <="0010";--发停止命令,结束传送>="0010";--发停止命令,结束传送>
rtx_f<='1'; --传送成功="">='1';>
Sta_n<=s0;>=s0;>
ELSE Sta_n<=s4;>=s4;>
END IF;
WHEN S5=>
IF ack_finish='1' THEN
IF ack_Flag='1' THEN
cmd_reg <="0010";--发停止命令,结束传送>="0010";--发停止命令,结束传送>
rtx_f<='0'; --接收失败="">='0';>
Sta_n<=s0;>=s0;>
ELSE --应答
cmd_reg <="1000";--准备读数据>="1000";--准备读数据>
Sta_n<=s6;>=s6;>
END IF;
ELSE
Sta_n<=s5;>=s5;>
END IF;
WHEN S6=>
IF ack_finish='1' THEN --1个数据读完
cmd_reg <="0010";--发停止命令,结束传送>="0010";--发停止命令,结束传送>
rtx_f<='1'; --接收成功="">='1';>
rxd_reg<=data_rxd;--接收数据送输出寄存器>=data_rxd;--接收数据送输出寄存器>
ELSE Sta_n<=s6;>=s6;>
END IF;
END CASE;
END IF;
END PROCESS;
END Four;
25. 模拟IC总线的顶层电路
(1) 名称:IIC.bdf
2(2) 功能:模拟IC总线对AT24C256的读写。 (3) 端口说明
方向 端口名 宽度 说明
复位信号,外接按钮开关,低电平复位 Rst 1
系统时钟 clk_sys 1
接口使能信号 ena 1
应答输入信号 Ack_in
输入 时钟使能信号 en_ clk 1
读写控制 rw 1
从机地址,送给传输寄存器 Slave_addr 7
从机子地址,送给传输寄存器 Sub_addr 16
待写入的输入数据 Data_tx 8
输出 Data_rx 8 读出的输出数据, 来自接收寄存器
传输完成标志 Rtx_flag 1
总线忙标志 Busy 1
22Ssd 1 IC总线的数据线,外接IC器件
22Scl 1 IC总线的时钟线,外接IC器件
(4) 顶层电路如图10所示。
2图10 模拟IC总线读写AT24C256的顶层原理图
范文二:接口电路
第 1章 微型计算机系统的构成
1.1试述微处理器、微型计算机和微型计算机系统的关系。
答:微处理器是指由一片或几片大规模集成电路组成的中央处理器。 微型计算机指以微处理器为基础, 配以内存储器以及输入输出接口电路和相应的辅助电路构成的裸机。微型计算机系统指由微处理器配 以相应的外围设备及其它专用电路、电源、面板、机架以及足够的软件而构成的系统。
1.2什么是单片机 ?
答:把构成一个微型计算机的一些功能部件集成在一块芯片之中的计算机。
1.3什么是单板机 ?
答:把微处理器、 RAM 、 ROM 以及一些接口电路,加上相应的外设 (如键盘、 7段显示器等 ) 以及监控 程序固件等 , 安装在一块印刷电路板上所构成的计算机系统。
1.4什么是个人计算机 ?
答:《英汉计算机词典》中解释为 “ 由微处理器芯片装成的、便于搬动而且不需要维护的计算机系统 ” 。 1.5试从微型计算机的结构说明数据总线、控制总线和地址总线的作用。
答:从微型计算机的结构看出,数据总线、控制总线和地址总线是微型计算机中 , CPU芯片与内存储 器和 I /O 接口电路之间信息传输的公共通路。
(1)数据总线是从微处理器向内存储器、 I/O接口传送数据的通路;反之,它也是从内存储器、 I/O接 口向微处理器传送数据的通路,称为双向总线。
(2)地址总线是微处理器向内存储器和 I/O接口传送地址信息的通路,是单向总线。
(3)控制总线是微处理器向内存储器和 I/O接口传送的命令信号, 以及外界向微处理器传送状态信号等 信息的通路,是双向总线
第 2章 8086微处理器
2.1 试说明标志寄存器中 AF 和 PF 的定义和用处。
答:标志寄存器中 AF (Auxiliary Carry Flag) D4 是辅助进位标志位。如果做加法时低位有进位或 做减法时低位有借位,则 AF=1,否则 AF=0。标志寄存器中 PF (Parity Flag) D2 是奇偶标志位。 如果操作结果低八位中含有偶数个 1,则 PF=1,否则 PF=0 (通信时用于纠错 ) 。
2.2 试说明标志寄存器中 DF 的的定义和用处。
答:标志寄存器中 DF (Direction Flag) D10 是方向标志位。在串处理指令中,若 DF=0,表示串处 理指令地址指针自动增量; DF=1,表示地址指针自动减量。 DF 位可由指令预置。
2.3 试说明段寄存器的作用。
答:8086微处理器中的 16位寄存器,用来存放对应的存储段的段基值 — 段起始地址的高 16位。通过 段寄存器值和指令中给出的 16位段内偏移量 , 可得出存储器操作数的物理地址 (20位 ) 。
2.4 试说明 8086的引脚信号中 M/IO、 DT/R、 RD 、 WR 、 ALE 和 BHE 的作用。
答:8086的引脚信号中 M/IO*的作用是,存储器 /I/O选择信号 (输出 ) 。用于区分当前操作是访问存 储器还是访问 I/O端口。若该引脚输出高电平,表示访问存储器;若输出低电平,表示访问 I/O端口。 DT/R*的作用是,数据发送 /接收信号(输出)用于指示数据传送的方向,高电平表示 CPU 发送数据, 低电平表示 CPU 接收数据。 该信号常用于数据缓冲器的方向控制。 (T)RD*的作用是, 读控制信号 (三 态输出) , 低电平有效时, 表示 CPU 正从存储器或 I/O端口读取信息。 WR*的作用是, 写控制信号 (三 态、输出),低电平有效。有效时表示 CPU 正将信息写入存储器或 I/O端口。 ALE 的作用是,地址锁 存允许,高电平有效。有效时表示地址线上的地址信息有效。 BHE*的作用是,数据总线高 8位输出允 许 / 状态 S7信号。在总线周期的 T1时刻,为数据总线高 8位允许信号 BHE ,低电平有效,有效时允 许高 8位数据在 D15— D8总线上传送。
2.5 什么是双重总线 ? 以 AD15~AD0引脚说明双重总线的功能是怎样实现的 ?
答:常把分时复用的总线称为双重总线,如某一时刻总线上出现的是地址,另一时刻,总线上出现的 是数据或状态 (控制 ) 信号。 8086CPU 的 AD15~AD0引脚 , 是地址 /数据复用引脚。 在总线周期的 T1时 刻,它们传送地址信息,在总线的 T2、 T3、 TW 和 T4时刻时,用来传送数据信息
2.6 试说明 8086的最小方式和最大方式的区别 .
答:8086微处理器有两种工作方式 : 在最小方式下,由 8086提供系统所需要的全部控制 信号,用 以构成一个单处理器系统。此时 MN /MX*线接 VCC(高电平 ) 。在最大方式下,系统的总线控制信号 由专用总线控制器 8288提供,构成一个多处理机或协处理机系统。此时 MN /MX*线接地。
2.7 8086的读周期时序和写周期时序的区别有哪些 ?
答:读操作与写操作的主要区别为:① DT/R*控制信号在读周期中为低电平,在写周期中为高电平; ②在读周期中, RD*控制信号在 T2~T3周期为低电平; WR*信号始终为高电平 (无效电平 ); 在写周期 中 WR*控制信号在 T2~T3周期为低电平,而 RD*信号始终为高电平 (无效电平 ) 。③在读周期中,数 据信息一般出现在 T2周期以后,双重总线 AD0~AD15上的地址信息有效和数据信息有效之间有一段 高阻态,因为 AD0~AD15上的数据 , 必须在存储芯片 (或 I /O 接口 ) 的存取时间后才能出现。而在写 周期中,数据信息在双重总线上是紧跟在地址总线有效之后立即由 CPU 送上,两者之间无一段高阻态 ④在读周期中,如果在 T3周期内,被访问的内存单元或 I /O 端口还不能把数据送上数据总线,则必须 在 T3之后插入等待周期 Tw ,这时 RD*控制信号仍为有效低电平。 在写周期中,如果在 T3周期内,被 访问的内存单元或 I /O 端口还不能把数据总线上的 数据取走, 则必须在 T3之后插入等待周期 Tw , 这 时 WR*控制信号仍为有效低电平。
2.8 什么是指令周期 ? 什么是总线周期 ? 什么是时钟周期 ? 说明三者的关系。
答:执行一条指令所需要的时间称为指令周期包括取指令、译码和执行等操作所需的时间。 — 指令周 期
CPU 通过总线操作完成同内存储器或 I/O接口之间一次数据传送所需要的时间。 — 总线周期 CPUJ 时钟脉冲的重复周期称为时钟周期,时钟周期是 CPU 的时间基准。 — 时钟周期
三者的关系:时钟周期是 CPU 的时间基准。总线周期至少包括
4个时钟周期即 T1、 T2、 T3和 T4,处在这些基本时钟周期中的总线状态称为 T 状态。一个指令周期由 一个或若干个总线周期组成
第 3章 汇编语言程序设计 习题解答
3. 设 DS=1000H, SS=2000H, AX=1A2BH, BX=1200H, CX=339AH, BP=1200H, SP=1350H, SI=1354H, (11350H)=0A5H, (11351H)=3CH, (11352H)=0FFH, (11353H)=26H, (11354H)=52H, (11355H)=OE7H, (126A4H)=9DH, (126A5H)=16H, (21350H)=88H,
(21351H)=51H
下列各指令都在此环境下执行,在下列各小题的 空格中填入相应各指令的执行结果。
(1)MOV AX, 1352H AX=
解:AX=1352H
(2)MOV AX, [1352H] ; AX=
解 : PA=DS*16+EA=10000H+1352H=11352H
(11352H)=0FFH, (11353H)=26H AX=26FFH
(3)MOV 0150H[BX], CH
(11350H)= (11351H)=
解:EA=BX+0150H=1350H PA=DS*16+EA=10000H+1350H=11350H,
CH=33H
(11350H)=33H, (11351H)的 值 不 变 , (11351H)=3CH
(4) MOV AX, 0150H[BP]
AX=____
解:EA= BP+0150H =1350H
PA=SS*16+EA=20000H+1350H=21350H AX=5188H
(5)POP AX ; AX=____, SP=____
解:EA= SP=1350H
PA=SS*16+EA=20000H+1350H=21350H AX=5188H, SP=1350H+2H=1352H (6)ADD[SI], CX
(11354H)=____, (11355H)=____, SF=____ ZF=____, PF=____, CF=____, OF=____ 解 :EA=SI=1354H, PA=DS*16+EA=10000H+1354H=11354H
CX=339AH, (11354H)=52H, (11355H)=OE7H 0E752H+339AH=11AECH->(11355H): (11354H) (11354H) =0ECH, (11355H)= 1AH (11354H) =0ECH, (11355H)= 1AH
CF=1,ZF=0,
PF(低八位奇偶校验 ) :0ECH= 11101100B?PF=0 SF(最高位状态 ) , 1H=0001B?SF=0
OF(溢出标志 )
0E752H =1110011101010010B
339AH=11001110011010B
1110011101010010
10001101011101100
(7)SUB BH, 0150H[BX][SI]
BH=____, SF=____, ZF=____, PF=____, CF=____, 0F=____
解 :EA=0150H+BX+SI=26A4H; PA=DS*16+EA=10000H+26A4H=126A4H; (126A4H)=9DH,BH=12H
BH=75H, SF=0,ZF=0,PF=0, CF=1 ,OF=0
(8)INC BYTE PTR 0152H[BX]
(11352H)=____, (11353H)=____, CF=____ 解 :EA=0152H+ BX= 1352H,PA=DS*16+EA=11352,
(11352H)=0FFH,
(11352H)=00H, (11353H)= 26H, 不影响 CF (9)INC WORD PTR 0152H[BX]
(11352H)=____, (11353H)=____, CF=____ 解 :EA=0152H+ BX= 1352H, PA=DS*16+EA=11532,
(11352H)=0FFH, (11353H)= 26H
(11352H)=00H, (11353H)= 27H, 不 影 响 CF
(10)SAR BYTE PTR 0150H[BX], 1
(11350H) =____, CF=____, OF=____ 解:EA=BX+0150H=1350H
PA =DS*16+EA=11350H,
(11350H)=0A5H= 10100101B
11010010B=0D2H, CF=1,OF=0
(当移位数为 1是,最高位不变则 OF=0) (11)SAL BYTE PTR 0150H[BX], 1
(11350H)=____, CF=____, OF=____
解 : EA=BX+0150H=1350H,PA=DS*16+EA=11350, (11350H)=0A5H= 10100101B
01001010B=4AH, CF=1,OF=1
3. 2 阅读下列各小题的指令序列,在后面空格 中填入
该指令序列的执行结果。
(1) MOV BL, 85H
MOV AL, 17H
ADD AL, BL
DAA
AL=____, BL=____, CF=____
解:17H+85H=9CH ?AL DAA 压缩的 BCD 码加法十进制调整指令。 (AL的低 4位 >9或 AF=1, AL ?AL+06H,AF?1; AF 是辅助进位标志用以标志 D3向 D4的进位 AL 的高 4位 >9或 CF=1, AL ?AL+60H,CF?1; ) AL=9CH+ 06H=0A2H
AL=0A2H+60H=02H, BL=85H CF=1
(2) MOV AX, BX ; NOT AX; ADD AX, BX ; lNC AX
AX=____, CF=____
解:lNC 不影响标志位 AX=0000H, CF=0 (3)MOV AX , 0FF60H ; STC ; MOV DX , 96
XOR DH, 0FFH ; SBB AX DX
AX=____, CF=____
解:XOR 命令 会使 CF ?0,OF ?0
96=60H, AX=0000H, CF=0
(4)MOV BX , 0FFFEH ; MOV CL,2; SAR BX,CL
BX=____, CF=____
解:0FFFEH=1111111111111110B
1111111111111111B,CF=0
1111 1111 1111 1111B,CF=1
3. 4完成下列操作,选用什么指令:
(1)将 AX 的内容减去 0520H , 和上次运算的借 位;
答:SBB AX,0520H
(2)将变量名 TABL 的段地址送 AX 。 答:MOV AX SEG TABL
3.5 D1 DB 20H DUP (?)
D2 DW D1
请写出用一条指令实现取 D1的偏移地址 SI 中 的三种方法。
答:(A) LEA SI, D1
(B) MOV SI, OFFSET D1
(C) MOV SI, D2
3.6 MOV BX , 0FFH
AND BX , 0FFFH
OR BX , 0F0FH
XOR BX , 00FFH
上述程序段运行后, BX= 0F00H,CF= 0 3.7 CMP AX , BX
JGE NEXT
XCHG AX , BX
NEXT: CMP AX , CX
JGE DONE
XCHG AX , CX
DONE: … .
试回答:
(1)上述程序段执行后,原有 AX 、 BX 、 CX 中最大数存放在哪个寄存器中?
最大数在 AX 中
(2)这 3个数是带符号数还是无符号数?
是带符号数
3.8画出下列语句的数据在存储器中的存储情况 : ARRAYB DB 63,63H,?ˉABCD ?ˉ,3 DUP(?),2 DUP(1,3)
ARRAYW DW 1234H,5,?ˉAB ?ˉ, ?ˉCD ?ˉ,?,2 DUP(1,3)
DB 定义长度为 1字节(8位)的数据(字节数据) DW 定义长度为 1字节(16位)的数据(字数据) 3.9程序中数据定义如下:
DATA1 DW ?
DATA2 DB 32 DUP(?)
DATA3 DD ?
DLENGTH EQU $-DATA1
? 此时 DLENGTH 的值是多少?
解答:DLENGTH=2(字) +32+4(双字) =38 3.10程序中数据定义如下:
ARRAY DB ?ABCDEF?
RESULT DB ?
TABLE DW 20 DUP (?)
? 则执行指令
MOV AX , TYPE RESULT 后, AX=1 MOV BX , TYPE TABLE 后, BX= 2 MOV CX , LENGTH TABLE 后, CX=20
MOV DX , LENGTH ARRAY 后, DX=1
MOV SI , SIZE TABLE 后, SI=2×20=40
MOV DI , SIZE ARRAY 后, DI=1 为 0100H 的单元数是 16个
3.11试按下列要求在数据段中依次书写各数据定 义语句:
(1)以 DA1为首字节的连续存储单元中存放 20H 个重复的数据序列:2, 3, 10个 4,一个 7。 (2) DA2为字符串变量,用字变量(DW )设置 一字符串; ?STUDENTS? (按次顺序存放在各 单元中)。
(3)用等值语句给符号 COUNT 赋值以 DA1为首 地址的数据区共占有的字节数,此等值语句必 须放在最后一语句。
解答:
(1) DA1 DB 20H DUP(2, 3, 10 DUP(4) ,
7)
(2) DA2 DW ?TS? , ?DU? , ?NE? , ?ST? ,
(3) COUNT EQU DA2- DA1
3.12下面程序段是实现从键盘输入十个一位 10进 制数后累加,最后累加和以非压缩 BCD 码形式存 放在 AH (高位)和 AL (低位)中。试把程序段 中所空缺的指令填上。
XOR BX ,BX ;BX 清零
; 传送数据长度 LOP:MOV AH,01H; 中断 INT 21H 的 01H 号调 用
INT 21H ; 中断调用 P172, 键 入值送入 AL 中
MOV AH,BH ;将 BH 的内容传 AH ADD AL,BL ;BL 与 AL 的值相加 , 结果 在 AL 中
; 非压缩 BCD 码加 法调整
MOV BX,AX ; 累加结果送 BX
LOOP LOP ;CX-1→ CX, 判断 CX ≠ 0, 则转
3.13下面程序段的功能是把 DA1数据区的 0-9转换 为对应的 ASC Ⅱ码 .
DA1 DB
00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ASCI DB 10 DUP(?)
CUNT = ASCI-DA1
LEA SI,DA1 ; 送数组 DA1的首地 址偏移量到 SI
LEA DI, ASCI ; 送数组 ASCI 的首地址 偏移量到 DI MOV CX, CUNT;
送数组 DA1的长度
LOP1: MOV AL,[SI] ; 取数
加 30H 变 成 ASC Ⅱ码
MOV [DI],AL ; 转换后存入数组 ASCI INC SI ; 源数据地址加 1 INC DI ; 目的数据地址 加 1
LOOP LOP1 ;CX-1→ CX, 判断 CX ≠ 0, 则转
3.14设 A,B 是长度为 10的字节数组 , 用串操作指令 编写程序实现 AB 两数组内容的相互交换 . 试完善 程序 .
DATA SEGMENT
A DB 1,2,3,4,5,6,7,8,9,0AH
ORG 0010H
B DB 0AH,9,8,7,6,5,4,3,2,1
DATA ENDS
…
LEA SI,A
LEA DI,B
MOV CX,10
LOP: LODSB
XCHG AL,[DI]
DEC DI
STOSB
INC DI
LOOP LOP
3.15编写一程序段 , 将 AL 中的第 7和第 0位 , 第 6和第 1位 , 第 5和第 2位 , 第 4和第 3位互换 .
MOV CX,8;
MOV AH,0;
K1: SHR AL,1; P99
RCL AH,1; P100
DEC CX ;
JNZ K1;
MOV AL,AH
3.16试编写一程序段 , 在 CHAR 为首的 26个单元中依次存放字母 ‘A’ - ‘Z’.
CHAR DB 26 DUP (? )
START: LEA BX, CHAR;
MOV AL, ? A?
MOV CX, 26
LOP1: MOV [BX] , AL
INC AL
INC BX
LOOP LOP1
HLT
3.17设在 DAT 单元存放一个 -9~+9的字节数据 , 在 SQRTAB 数据区中存放 0~9的平方值 , 请用直接查表法 编写一子程序 , 在 SQRTAB 中查找出 DAT 单元中数据对应的平方值送 SQR 单元 . 并写出主程序的调用方 式 .
数据段如下 :
DATA SEGMENT
DAT DB XXH
SQRTAB DB 0, 1, 4, 9,…, 81
SQR DB ?
DATA ENDS
DATA SEGMENT
DAT DB XXH
SQRTAB DB 0, 1, 4, 9, … , 81
SQR DB ?
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS :CODE , DS :DATA , SS :STACK
START :MOV AX, DATA
MOV DS, AX
┇
CALL DTOS
┇
MOV AH, 4CH
INT 21H
DTOS PROC
PUSH AX
PUSH BX
LEA BX, SQRTAB
MOV AL, DAT
TEST AL, 80H ;判断 AL 的正负
JE NEXT
NEG AL
NEXT : XLAT SQRTAB ; AL ←(BX+AL)
MOV SQR, AL
POP BX
POP AX
RET
DTOS ENDP
CODE ENDS
END SRART
第 4章 内存储器及其接口习题解答
4.1用下列芯片构成存储系统 , 需要多少 RAM 芯片 ? 需要多少位地址作为片外地址译码 ? 设系统为 20位地 址线 , 采用全译码。 (1)512×4位 RAM 构成 16KB 的存储系统 ;(2)1024×1位 RAM 构成 128KB 的存储系 统 ;(3)2K×4位 RAM 构成 64KB 的存储系统 ;(1)64K×1位 RAM 构成 256KB 的存储系统 ;
解答 :
芯片 存储系统容量 多少芯片 片外译码线 (20根地址 )
(1)512×4位 16KB 64片 11根
512×8位 2片 → 1K ×8位 4片→ 16 ×4片 =64片
片内地址寻址 512=29, 片内地址寻址将用去 9根线 , 片外译码线 20-9= 11根
(2)1024×1位 128KB 1024片 10根
1024×8位 8片 → 128K 位 ×8位 8片×128=1024片
片内地址寻址 1024=210, 片内地址寻址将用去 10根线 , 片外译码线 20-10= 10根
(3)2K×4位 64KB 64片 9根
2K ×8位 2片 → 2K ×32=64KB, 2片×32=64片
片内地址寻址 2K=211, 片内地址寻址将用去 11根线 , 片外译码线 20- 11 = 9根
(1)64K×1位 256KB 32片 4根
64K ×8位 8片 → 64K ×8位 ×4=256KB→ 8片×4=32片
片内地址寻址 64K=216, 片内地址寻址将用去 16根线 , 片外译码线 20-16=4
4.2现有一种存储芯片容量为 512×4位 , 若要它组成 4KB 的存储容量 , 需要多少这样的存储芯片 ? 每块芯 片需要多少寻址线 (片内寻址 )? 而 4KB 存储系统需要多少寻址线 ?
解答 :512×4位的芯片 2片→ 512×8位的 2组 (4片 ) → 1K ×8 → 4 ×4=16片
(1)需要 16片 512×4位可以组成 4KB 的存储容量
(2)512=29需要 9根地址线片内寻址
(2) 4KB=212, 系统需要 12根寻址线
4.3 有一个 2716(2K ) EPROM 芯片的译码电路,如图所示,请计算该芯片的地址范围。
解答 :地址范围:A 19… A16 A 15 … A 12 A 11 A 10 A 9 A 8 A 7 … A 4 A 3 … A 0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
A 13 A 12 A 11范围:(A11=0) FF000H — FF7FFH
11 1 (A11=1) FF800H — FFFFFH
1 1 0
4.4某一存储器系统如图 5-2所示 , 回答他们的存储容量是多少 ?RAM 和存储器 EPROM 地址范围各是多 少 ?
A 19… A16 A 15 … A 12 A 11 A 10 A 9 A 8 A 7 … A 4 A 3 … A 0
EPROM 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
RAM 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
EPROM 范围:FD000H-FDFFFH
RAM 范围:A11=0时, F9000H-F97FFH A11=1时, F9800H-F9FFFH
4.5使用 6116、 2732和 74LS138译码器构成一个存储容量为 12KB 的 ROM (00000H-02FFFH ) , 8KB RAM (03000H-04FFFH )的存储系统。系统地址总线 20位,数据总线 8位。
A 19… A16 A 15 … A 12 A 11 A 10 A 9 A 8 A 7 … A 4 A 3 … A 0
1# ROM 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Y0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
2# ROM 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
Y1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
3# ROM 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
Y2 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
A 19… A16 A 15 … A 12 A 11 A 10 A 9 A 8 A 7 … A 4 A 3 … A 0
1# RAM 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
Y3 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1
2# RAM 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0
Y3 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
3# RAM 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Y4 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1
4# RAM 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
Y4 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
4.68086CPU 执行 MOV [2001H],AX指令 , 从取指令到执行指令最少需要多少时间 ? 设时钟频率为 5MHz, 该指令机器码为 4个字节 , 存放在 1000H:2000H开始的 4个单元。
解答:见 P69页,一个总线周期最少需要 4个 T 状态
? T 状态的周期:T=1/5MHz=0.2μS
? 一个总线周期 =4×T= 4×0.2μS= 0.8μS
? 由于指令 MOV [2001H],AX存放在 1000H:2000H开始的 4个单元中 , 且是偶地址开始 , 因此 CPU 在读 指令机器码是是 “ 字对准 ” 的 , 读一个字只需要一个总线周期 , 读 2个字 (4个单元 ) 需要 2个总线周期 . 。 ? 但是在执行指令 MOV [2001H],AX时,是将 AX 中的数送到 DS :2001H 开始的存储器单元中,属于 非规则存储,因此需要分 2个总线周期才能将 AX 中的数据送到 DS :2001H 开始的 2个存储器单元中 ? 因此包括取指令和执行指令共需要 4个总线周期
? 从取指令到执行指令最少需要多少时间 =4×0.8μS=3.2μS
范文三:USB接口电路电路
左边这张图,过
了保险丝以后, 接了一个 470uF 的电容 C16, 右边这张图, 经过开关后,
接了一个 100uF 的电容 C19,并且并联了一个 0.1uF 的电容 C10。其中
C16 和 C19 起到的作用是一样的, C10 的作用和他们两个不一样,我
们先来介绍这 2
个大一点的电容。容值比较大的电容,理论上可以理
解成水缸或者水池子,同时,大家可以直接把电流理解成水流,其实 大自然万物的原理都是类似的。作用一,缓冲作用。当上电的瞬间, 电流从电源处流下来的时候,不稳定,容易冲击电子器件,加个电容 可以起到缓冲作用。就如同我们直接用水龙头的水浇地,容易冲坏花 花草草的。我们只需要在水龙头处加个水池,让水经过水池后再缓慢 流进草地,就不会冲坏花草,起到有效的保护作用。
作用二,稳定作用。我们一整套电路,后级的电子器件功率大小、电流 大小也不一样,器件工作的时候,电流大小不是一直持续不变的。比如 后级有个器件还没有工作的时候, 电流消耗是 100mA , 突然它参与工作了, 电流猛的增大到 150mA 了,这个时候如果没有一个水缸的话,电路中的 电压 (水位 ) 就会直接突然下降,比如我们的 5V 电压突然降低到 3V 了。 而我们系统中有些电子元器件,必须高于一定的电压才能正常工作,电 压太低就直接不工作了,这个时候水缸就必不可少了。电容会在这个时 候把存储在里边的电流释放一下,稳定电压,当然,随后前级的电流会 及时把水缸充满的。有了这个电容,可以说我们的电压和电流就会很稳 定了,不会产生大的波动。这种电容
常用的有以下三种:
图 3-这三种电容是我们常用的三种电容, 其中第一种个头大, 占空间大, 单位容 量价格最便宜,第二种和第三种个头小,占空间小,性能一般也略好于第一种, 但是价格也贵不少。当然,除了价格,还有一些特殊参数,在通信要求高的场合 也要考虑很多, 这里暂且不说。 我们板子上现在用的是第一种, 只要在符合条件 的情况下, 第一种 470uF 的电容不到一毛钱, 同样的耐压和容值, 第二种和第三
种可能得 1 块钱左右。
电容的选取,第一个参数是耐压值的考虑。我们用的是 5V 系统,电容的耐压值 要高于 5V , 一般推荐 1.5 倍到 2 倍即可, 有些场合稍微高于也可以。 我们板子上 用的是 10V 耐压的。 第二个参数是电容容值, 这个就需要根据经验来选取了, 选 取的时候, 要看这个电容起作用的这块系统的功率消耗情况, 如果系统耗电较大, 波动可能比较大,那么容值就要选大一些,反之,可以小一些。
刚开始同学们设计电路也模仿别人, 别人用多大自己也用多大, 慢慢积累。 比如 咱上边讲电容作用二的时候, 电流从 100mA 突然增大到 150mA 的时候, 其实即使 加上这个电容,电压也会轻微波动,比如从 5V 波动到 4.9V ,但是只要我们板子 上的器件在电压 4.9V 以上也可以正常工作的话,这点波动是没有问题的,但是 如果不加或者加的很小, 电压波动比较大, 有些器件就会工作不正常了。 但是如 果加的太大,占空间并且价格也高,所以这个地方电容的选取多参考经验。 第二个电容,容值较小,是 0.1uF ,也就是 100nF ,是用来滤除高频信号干扰的。 比如 ESD , EFT 等。有一点大家要清楚,我们初中学过电容可以通交流隔直流, 但是电容的参数对不同频率段的干扰的作用是不一样的。 这个 100nF 的电容, 是 我们的前辈根据干扰的频率段, 根据板子的参数, 根据电容本身的参数所总结出 来的一个值。 也就是说, 以后大家在设计数字电路的时候, 在电源处的去耦高频 电容,直接用这个 0.1uF 就可以了,不需要去计算。还有一点,就是大家看我们 的电路图可以看出来,通常在电路中可能瞬间电流较大的地
方,会加一个大电容,比如在 1602 液晶左上角的那个,靠近了单片机的 VCC 以 及 1602 液晶背光的 VCC , 起到稳定电压的作用, 在左上角电机和蜂鸣器位置有一 个,也是起到稳定电压的作用。还有在所有的 IC 器件的 VCC 和 GND 之间,都会
放一个 0.1uF 的高频去耦电容, 特别在布板的时候, 这个 0.1uF 电容要尽可能的 靠近 IC ,尽量很顺利的将这个 IC 的 VCC 和 GND 连到一起,这个大家先了解,细 节以后再讨论。 __
范文四:USB接口定义,USB接口电路
左手665收藏 时间:?2015-3-30 8:45
USB接口定义:USB有4根线,分别为:
电源+VCC(红 1 脚)、 Pin 1。
电源- GND(黑 4 脚)、Pin 4。
DATA+ 数据线(绿 3 脚)、Pin 3。
DATA -?数据线(白 2 脚)。Pin 2。
A型接口:
B型接口:
USB接口定义图:
USB接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了,否则会烧掉usb设备或者电脑的南桥芯片:
针脚
名称
说明
接线颜色
1
VCC
+5V电压
红线
2
D-
数据线负极
白线
3
D+
数据线正极
绿线
4
GND
接地
黑线
一般而言:
红(Vcc),白(D-),绿(D+),黑(GND)
mini USB (小型接口?见下图:)引脚定义:
引脚
功能
颜色
备注
1
V BUS
红
电源+5V
2
DATA-
白
数据-
3
DATA+
绿
数据+
4
ID
A型:与地相连 电源-5V
B型:不接地(空)
5
GND
黑
地???????? 电源-5V
其中ID脚在OTG功能中才使用。由于Mini-USB接口分Mini-A、B和AB接口。
如果你的系统仅仅是用做Slave,那么就使用B接口。
系统控制器会判断ID脚的电平判断是什么样的设备插入,如果是高电平,则是B接头插入,此时系统就做主模式(master mode)
如果ID为低,则是A接口插入,然后系统就会使用HNP对话协议来决定哪个做Master,哪个做Slave。
以上从左往右依次为:miniUSB公口(A型插头)、miniUSB公口(B型插头)、USB公口(B型)、USB母口(A型插座)、USB公口(A型插头)
各种USB插头实物图:
USB引脚定义:
针脚
名称
说明
接线颜色
1
VCC
+5V电压
红色
2
D-
数据线负极
白色
3
D+
数据线正极
绿色
4
GND
接地
黑色
MiniUSB接口定义:
MiniUSB引脚定义:
针脚
名称
说明
接线颜色
1
VCC
+5V电压
红色
2
D-
数据线负极
白色
3
D+
数据线正极
绿色
4
ID
permits distinction of
Micro-A- and Micro-B-Plug
Type A:connected to Ground
Type B:not connected
none
5
GND
接地
黑色
USB插头实物图:
图中从左往右依次是:MiniUSB公口(A型插头)、MiniUSB公口(B型插头)、USB公口(B型插头)、USB母口(A型插座)、USB公口(A型插头)
USB图标和Logo:
标签:?USB,?接口
数据神线制作全教程
线材处理完了,接下来我们需要做的就是更为考验技术的工作了:那就是焊接。说到焊接,我们就要想到电烙铁。电烙铁本身会发出300摄氏度甚至是更高的温度,所以在使用电烙铁前,笔者需要提醒大家:虽然急于制作好线材的心情笔者可以理解,但是在使用电烙铁的时候一定要注意安全,不要烫伤自己或者烫坏其他东西。使用完毕后要注意及时关闭电源,以免让电烙铁长时间干烧而损坏。
在插头的焊接方面,我们要了解不同的USB插头的针脚定义。标准的USB插头的引脚,按照我们插向电脑的方向,从左到右分别为5V+、DATA-、DATA+以及5V-。除此之外,Micro-USB插头的引脚定义比较复杂,笔者通过图示为大家介绍。
标准USB接口焊接引脚定义
Micro USB焊接引脚定义
将4根线材焊接到USB插头相应的针脚上,两端一共需要焊8个点,看似很简单的样子,但是由于USB插头焊点较小,尤其是Micro-USB端,每个焊点的宽度仅有区区几毫米,想要再如此小且密集的区域焊接线材并不是一个容易的事情。所以笔者在这里教上大家几招:
1.电烙铁需要使用尖头的烙铁头,这样可以准确焊接指定的焊点。
2.选用质量较好的焊锡。好的焊锡不仅浸润性更好,同时由于残渣少,所以焊接后焊点更加牢固且美观。
3.焊接时需要快速准确一气呵成,长时间对同一焊点加热会烫坏插头部分的塑料件从而造成焊点短路或者松动。
焊接前要提前在线上穿上数段热缩管
焊接前,我们需要提前将后期准备处理的热缩管套在USB线材上。因为焊接后USB插头的外壳需要锁紧以及固定,而我们在焊接好插头后就没有机会再往线材上套需要用的热缩管了。所以我们需要打上提前量,将保护线材以及固定用的热缩管提前准备好。稍后大家就会知道这一步的重要性。笔者建议是每一端需要提前再套上2-3层热缩管,以方便一会儿的后期处理。如果后面处理完后有多余的热缩管,可以使用剪刀剪掉,但是如果你没有提前套好的话,那么一会儿就要后悔了。
线材和焊点需要提前上一层焊锡
焊接完成后的效果
首先我们使用剥线钳或者其他工具将线材的线芯剥离出一定的长度,然后先使用焊锡在线芯上搪上一层锡,这样可以防止线芯开叉。另外我们在真正焊接前提前将插头的焊点上搪上一滴焊锡,这样一会儿在焊接的过程中,我们就不需要再次补充焊锡。接着我们固定好插头,然后用镊子夹住线材放在焊点上用电烙铁加热使焊使其锡融化即可完成焊接。如果你对自己使用电烙铁的水平没有足够的信心的话,可以找块废弃的电路板进行练习。很快你就能找到其中的诀窍。
插头两端焊点相对应焊接完毕后最好再测试一下连通性
焊接完其中的一端插头后,我们需要使用万用表找到另一端相对应的需要焊接的线,然后将线焊在插头对应的引脚上。两端的插头全部焊接完成后,我们要再次使用万用表测试插头两端的连通性。如果每条线路都是通路且引脚没有焊错的话,这一步最为艰巨的工作就算是全满完成了。
前一页?[1]?[2]?[3]?[4]?[5]?下一页
USB接口定义,USB接口图
无意侵犯您的权益,如有侵犯请[联系我]
USB接口定义,USB接口图
USB接口定义,USB接口图
USB接口是 Universal Serial Bus 的缩写,。外观Pc一侧为 4 针公插,设备一侧为 4 针母插。两根信号线两跟电源线,进行全双工模式的高速数据传输。
USB接口定义
USB接口定义详解(图)
左手665欢迎你
左手665收藏 时间:?2015-3-30 8:45
USB是一种常用的pc接口,他只有4根线,两根电源两根信号,如下图.故信号是串行传输的,usb接口也称为串行口,usb2.0的速度可以达到480Mbps。可以满足各种工业和民用需要.USB接口的输出电压和电流是: +5V 500mA 实际上有误差,最大不能超过+/-0.2V 也就是4.8-5.2V 。usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了,否则会烧掉usb设备或者电脑的南桥芯片:黑线:gnd 红线:vcc 绿线:data+ 白线:data-
--------------------------------------------------------
USB接口定义 颜色
一般的排列方式是:红白绿黑从左到右
定义:
红色-USB电源:??? 标有-VCC、Power、5V、5VSB字样
绿色-USB数据线:(正)-DATA+、USBD+、PD+、USBDT+
白色-USB数据线:(负)-DATA-、USBD-、PD-、USBDT+
黑色-地线:??????????? GND、Ground
---------------------------------------------------------
关于MINIUSB
一般MINIUSB是5芯的:
1——VCC
2——D-
3——D+
4——ID
5——GND
USB3.0插座示意图
時間2015年3月30
USB 3.0插座是可以向下兼容USB 2.0的,相对于旧插座来说,USB 3.0插座增加了5pin的金属触片,对应USB 3.0线缆中A型接口的USB3_TX、GND以及USB3_RX触片。
USB 3.0插座示意图及实物图
USB 3.0 A型接口示意图以及实物
USB 3.0线缆A型接口触片增加到了9pin,其中下方的4pin可兼容旧有的USB 2.0/1.1/1.0标准,而后方增加的5pin则属于USB 3.0,分别为USB3_TX、USB3_TX、GND、USB3_RX及USB3_RX。
USB 3.0标准B型接口以及Micro-B接口示意图
USB 3.0标准的B型接口如上图所示,主要连接外设使用,具备4pin+5pin金属触片。标准B型接口外形较为“方正”,而Micro-B型接口则较扁,主要用于体积较小的设备,如MP3、手机、数码相机等。
左手665收藏 时间:?2015-3-30 8:45
范文五:CAN总线接口电路
摘要
介绍了采用 PHILIP 公司生产的控制器局域网的高度集成的通信控制器 SJA1000和 82C250作为收发器的 CAN 总线接口电路的硬件设计方法,介绍了控制器和收发器 及看门狗芯片的特点、内部结构、寄存器结构及地址分配,说明一种通用型 CAN 总线 的设计和开发.探讨应用中需注意的一些问题。
关键词:CAN 总线;控制器;收发器;电路设计
目次
摘要 .................................................................... I 1 绪论 ................................................................ 1 1.1 CAN总线简介 ..................................................... 1 1.1.1 CAN协议 ................................................... 1 1.1.2电气参数及信号表示......................................... 2 1.2 CAN的主要技术特点 ............................................... 2
1.3 CAN总线通信系统拓扑结构......................................... 3
2 CAN总线接口电路设计 ................................................. 3 2.1 总体方案设计 .................................................... 3 2.2 各模块电路的设计 ................................................ 4 2.2.1单片机最小系统............................................. 4 2.2.2 CAN总线接口控制电路设计 ................................... 5 2.2.2.1SJA1000简介 .......................................... 5 2.2.2.2基于SJA1000的控制电路设计........................... 10 2.2.3 CAN总线收发电路设计 ...................................... 11 2.2.3.1CAN总线收发器 82C250介绍............................. 11 2.2.3.2基于 82C250收发电路设计............................. 14 2.2.4复位、监控电路设计........................................ 15 2.2.4.1X5045P简介........................................... 15 2.2.4.2基于X5045P的电路设计 ................................ 18 2.2.5电源设计 .................................................. 18
2.3 接口电路总体电路原理图......................................... 19
3 结束语 ............................................................. 21 参考文献 .............................................................. 22 附录 1: 接口电路总体电路原理图 ......................................... 23
1 绪论
1.1 CAN总线简介
CAN[Control(Controller) Area Network]是控制(器)局域网的简称。CAN 是一 种有效支持分布式控制或实时控制的串行通信网络,最初由德国 Bosch 公司 80年代 用于汽车内部测试和控制仪器之间的数据通信。 目前 CAN 总线规范已被国际标准化组 织 ISO 制订为国际标准 ISO11898,并得到了 Motorola,Intel ,Philips 等大半导体 器件生产厂家的支持,迅速推出各种集成有 CAN 协议的产品。目前 CAN 总线主要用于 汽车自动化领域,如发动机自动点火、注油、复杂的加速刹车控制(ASC) 、抗锁定刹 车系统 (ABS) 和抗滑系统等。 BENZ、 BMW 等著名汽车上已经采用 CAN 来满足上述功能。 在工业过程控制领域,CAN 也得到了广泛的应用。
1.1.1 CAN协议
CAN总线采用分层结构,规范规定了任意两个节点之间的兼容性。包括电气特件 利数据解释协议 。
CAN协议可分为:目标层、 传送层、 物理层。 其中目标层和传送层包括了 ISO/OSI定义的数据链路的所有功能。目标层的功能包括:确认要发送的信息;位应用层提供 接口。传送层功能包括:数据帧组织:总线仲裁:检错、错误报告、错误处理。 CAN 总线以报文为单位进行信息交换,报文中含有标示符(ID) ,它既描述了数据 的含义又表明了报文的优先权。CAN 总线上的各个协点都可主动发送数据。当同时有 两个或两个以上的节点发送报文时,CAN 控制器采用 ID 进行仲裁。ID 控制节点对总 线的访问。发送具有最高优先权报文的节点获得总线的使用权,其他节点自动停止发 送,总线空闲后,这些节点将自动重发报文。
CAN 支持四类信息帧类型。
(1)数据帧 CAN协议有两种数据帧类型标准 2.0A 和标准 2.0B。两者本质的 不同在于 ID 的长度不同。在 2.0A 类型中,ID 的长度为 l l 位;在 2.0B 类型中 ID 为 29位。一个信息震中包括 7个主要的域:
帧起始域——标志数据帧的开始,由一个显性位组成。
仲裁域——内容由标示符和远程传输请求位(RTR)组成,RTR 用以表明此信息帧 是数据帧还是不包含任何数据的远地请求帧。当 2.0A 的数据帧和 2.0B 的数据帧必须 在同一条总线上传输时,首先判断其优先权,如果 ID 相同,则非扩展数据帧的优先
权高于扩展数据帧。
控制域——r0、r1是保留位,作为扩展位,DLC 表示一帧中数据字节的数目。 数据域——包含 0~8字节的数据。
校验域——检验位错用的循环冗余校验域,共 15位。
应答域——包括应答位和应答分隔符。正确接收到有效报文的接收站在应答期间 将总线值为显性电平。
帧结束——由七位隐性电平组成。
(2)远程帧 接受数据的节点可通过发远程帧请求源节点发送数据。它由 6个域 组成:帧起始、仲裁域、控制域、校验域、应答域、帧结束。
(3)错误指示帧 由错误标志和错误分界两个域组成。接收节点发现总线上的报 文有误时,将自动发出“活动错误标志”其他节点检测到活动错误标志后发送“错误 认可标志”。
(4)超载帧 由超载标志和超载分隔符组成。超载帧只能在一个帧结束后开始。 当接收方接收下一帧之前,需要过多的时间处理当前的数据,或在帧问空隙域检测到 显性电平时,则导致发送超载帧。
(5)帧间空隙 位于数据帧和远地帧与前面的信息帧之间,由帧间空隙和总线空 闲状态组成。帧间空隙是必要的,在此期间, CAN不进行新的帧发送,为的是 CAN 控 制器在下次信息传递前有时间进行内部处理操作。当总线空闲时 CAN 控制器方可发送 数据。
1.1.2电气参数及信号表示
总线上的数据采用不归零编码方式(NRZ) ,可具有两种互补的逻辑值之一:显性 及隐性。CAN 总线中各节点使用相同的位速率。它的每位时间由同步段、传播段、相 位缓冲段 1及相位缓冲段 2组成。发送器在同步段前改变输出的位数值,接受器在两 个相位缓冲段间采样输入位值,而两个相位缓冲段长度可自由调节,以保证采样的可 靠性。另外,CAN 总线采用时钟同步技术来保证通讯的同步。
1.2 CAN的主要技术特点
CAN网络上的节点不分主从, 任一节点均可在任意时刻主动地向网络上其他节点发 送信息,通信方式灵活,利用这一特点可方便地构成多机备份系统
CAN 只需通过报文滤波即可实现点对点、一点对多点及全局广播等几种方式传送 接收数据,无需专门的
CAN的直接通信距离最远可达 10km(速率 5kbps 以下) ;通信速率最高可达
1Mbps(此时通信距离最长为 40m)。
CAN上的节点数主要决定于总线驱动电路, 目前可达 110个; 报文标识符可达 2032种(CAN2.0A) ,而扩展标准(CAN2.0B)的报文标识符几乎不受限制。
1.3 CAN总线通信系统拓扑结构
CAN 在物理结构上属于总线式通信网络。系统的组成如下图:
图 1 CAN总线系统结构图
该系统由上位监控 PC 机、智能节点和现场设备三部分组成。上位监控 PC 机主要 负责对系统数据的接受与管理、控制命令的发送以及各控制单元动态参数和设备状态 的实时显示;智能节点可以使现场设备方便地连接到 CAN 总线上,主要负责对现场的 环境参数和设备状态进行监测,对采集来的数据进行打包处理并将处理古的数字信号 通过 CAN 通信控制器 SJA1000发送到 CAN 总线。智能节点的设计和选择,对通信信号 的传输发送有很的影响, 系统中的数据传送和接收, 都是通过 CAN 总线接口实现。 CAN 总线接口电路的设计,对 CAN 总线很是重要。本文正是基于此,对 CAN 总线接口电路 进行设计分析,给出一种设计方案。
2 CAN总线接口电路设计
2.1 总体方案设计
CAN 总线接口电路主要包括:单片机、 控制器接口、 总线收发器和看门狗电路等。 采用 Philips 公司生产的 SJA1000控制器和与其配套的 82C250CAN 收发器。按照 CAN 总线物理层协议选择总线介质,设计布线方案,连接成 CAN 网络。双绞屏蔽线可设两 套,在两套介质上同时进行信息传输,接收方只用一个介质。在冗余和非冗余段的连 接临界点处进行总线切换。
硬件电路的设计主要是 CAN 通信控制器与微处理器之间和 CAN 总线收发器与物理 总线之间的接口电路的设计。CAN 通信控制器是 CAN 总线接口电路的核心,主要完成 CAN 的通信协议,而 CAN 总线收发器的主要功能是增大通信距离,提高系统的瞬间抗 干扰能力,保护总线,降低射频干扰(RFI) ,实现热防护等。看门狗电路主要是实现 对电路的监控和复位作用。
目前广泛流行的 CAN 总线器件有两大类:一类是独立的 CAN 控制器,如 82C200、 SJA1000及 Intel82526/82527等, 另一类是带有在片 CAN 的微控制器, 如 P8XC582及 16位微控制器 87C196CA/CB等。本课题选取 PHILIPS 公司的 SJA1000 CAN 控制器以及 82C250总线收发器,主要是考虑到 SJA1000支持 CAN 2.0A/B规约。而 82C250可以支 持 110个 CAN 节点,并且国内市场上 PHILIPS 的产品型号比较多,购买比较方便。在 本次设计中,接口电路简单表示如下图:
图 2-1 接口电路总体框图
2.2 各模块电路的设计
2.2.1单片机最小系统
本设计中, 应用到单片机为 ATMEL 公司 51系列的 89C51, 该型号的单片机应用广 泛,技术成熟,市场上价格便宜,而且在学习中所学到的多为该型号,在本次设计中 是首选的芯片。89C51单片机作为系统的核心控制部分,但在本设计中不是重点讲解 内容,其相关技术应用和引脚特点功能等,可参照其他相关资料。设计的电路原理方 框大致如下图 2-2所示。
设计中为避免出现时钟信号的冲突,对单片机的外接晶振引脚 XTAL1、XTAL2不 接上外围电路,而是通过控制器 SJA1000的时钟信号脚反馈给单片机。同时,对单片 机的复位信号处理,RST 引脚接上 X5045P 的 RST 脚,复位信号可由 X5045P 输出,在 X5045P 芯片看门狗外围电路的作用下, 减少了以往由电阻、 电容组成的简易复位电路 造成的不精确、延时高等不良作用,使单片机回复到初始状态,完成复位操作。由于 在该电路中要用到单片机的存储作用,存储由 SJA1000传输过来的处理数据。因此, 脚/EA接上高电平,选用片内 ROM。对 ALE 脚,也即地址锁存有效信号除数端是和控
制器 SJA1000的 ALE 脚接通。
2.2.2 CAN总线接口控制电路设计
SJA1000 在电路中是一个总线接口芯片,通过它实现上位机与现场微处理器之间 的数据通信。该电路的主要功能是通过 CAN 总线接收来自上位机的数据进行分析组态 然后下传给下位机的控制电路实现控制功能,当 CAN 总线接口接收到下位机的上传数 据,SJA1000就产生一个中断,引发微处理器产生中断,通过中断处理程序接收每一 帧信息并通过 CAN 总线上传给上位机进行分析。 AT89C51是 CAN 总线接口电路的核心, 其承担 CAN 控制器的初始化、CAN 的收发控制等任务。
2.2.2.1SJA1000简介
PHILIPS 公司的 PCA82C200是符合 CAN2.0A 协议的总线控制器,SJA1000是它的 替代产品,它是应用于汽车和一般工业环境的独立 CAN 总线控制器。具有完成 CAN 通 信协议所要求的全部特性。经过简单总线连接的 SJA1000可完成 CAN 总线的物理和数 据链路层的所有功能。其硬件与软件设计和 PCA82C200的基本 CAN 模式(BesicCAN) 兼容。同时,新增加的增强 CAN 模式(PeliCAN)还可支持 CAN2.0B 协议。SJA1000的 主要特性如表 1所示。
表 1 SJA1000寄存器配置(复位模式)
名称 地
址
7 6 5 4 3 2 1 0
模 式 寄 存 0 - - -
睡眠方
式
滤波方
式
自检方
式
监听方式 复 位
命 令 寄 存 1 - - -
自收请
求
清超限
状态
释放接
收缓冲
夭折发送 发 送
状 态 寄 存 2 总线状态
错误状
态
发送状
态
接收状
态
发送完
成状态
发送缓
冲器状
数据超限 接 收
中 断 寄 存 3
总线错误
中断
仲裁丢
失中断
错误认
可状态
唤醒中
断
数据超
限中断
错误报
警中断
发送中断 接 收
中 断 允 许 4
总线错误
中断允许
仲裁丢
失中断
错误认
可中断
唤醒中
断允许
数据超
限中断
错误报
警中断
发送中断 允许 接 收
保留 5
总 线 定 时 6 SJM.1 SJM.0 BRP.5 BRP.4 BRP.3 BRP.2 BRP.1 BRP .0
总 线 定 时 7 SAM
TSEG2.
2
TSEG2.1
TSEG2.
TSEG1.
3
TSEG1.
2
TSEG1.1 TSE G1.
输 出 控 制 8 COTP1 OCTN1 OCPOL1OCTP0 OCTN0 OCPOL0OCMODE1 OCM ODE
测 试 寄 存 9 保留 10
仲 裁 丢 失 11 - - - ALC.4 ALC.3 ALC.2 ALC.1 ALC .0
出 错 码 捕 12 ECC.7 ECC.6 ECC.5 ECC.4 ECC.3 ECC.2 ECC.1 ECC .0
错 误 警 告 13 EWL.7 EWL.6 EWL.5 EWL.4 EWL.3 EWL.2 EWL.1 EWL .0
RX 出 错 计 14 RXERR.7
RXERR.
6
RXERR.5
RXERR.
4
RXERR.
3
RXERR.
2
RXERR.1 RXE RR.
TX 出 错 计 15 TXERR.7
TXERR.
6
TXERR.5
TXERR.
4
TXERR.
3
TXERR.
2
TXERR.1 TXE RR.
滤 波 码 寄 16
~
AC.7 AC.6 AC.5 AC.4 AC.3 AC.2 AC.1
AC. 0
滤 波 屏 蔽 20
~
AM.7 AM.6 AM.5 AM.4 AM.3 AM.2 AM.1
AM. 0
保留 24
~
00H 00H 00H 00H 00H 00H 00H 00H
RX 报 文 个 29 0 0 0 RMC.4 RMC.3 RMC.2 RMC.1 RMC .0
RX 缓 冲 器 30 0 0 RBSA.5RBSA.4RBSA.3RBSA.2RBSA.1 RBS A.0
时 钟 分 配 31 CAN 模式 CBP RXINTEN 0
Clock
offf
CD.2 CD.1
CD. 0
内 部 RAM 32 ~
内 部 RAM 96/ 108
内 部 RAM 109 /11
00H 112
/12
●管脚及电气特性与独立 CAN 总线控制器 PCA82C200兼容;
●软件与 PCA82C200兼容(缺省为基本 CAN 模式) ;
●扩展接收缓冲器(64字节 FIFO) ;
●支持 CAN2.0B 协议; ●同时支持 11位和 29位标识符;
●位通讯速率为 1Mbits/s;
●增强 CAN 模式(PeliCAN);
●采用 24MHz 时钟频率;
●支持多种微处理器接口;
●可编程 CAN 输出驱动配置;
● 工作温度范围为-40~+125℃。
图 2-3 SJA1000引脚配置
SJA1000的功能框图如表 1所示,图 2-3是其引脚图。从表 1可以看出,SJA1000型独立 CAN 总线控制器由以下几部分构成;
(1)接口管理逻辑:它接收来自微处理器的命令,控制 CAN 寄存器的地址,并 为微处理器提供中断和状态信息。
(2)发送缓冲器:有 13字节长。它位于 CPU 和位流处理器(BSP)之间,能存 储一条将在 CAN 总线上发送的完整的报文,报文由 CPU 写入,由 SBP 读出。
(3)接收缓冲器(RXB、RXFIFO) :它是 CPU 和接收滤波器之间的接口,用来存 储从 CAN 总线接收并通过了滤波的报文。接收缓冲器 RXB 是提供给 CPU 可访问的 13字节的窗口,这个窗口是属于接收 FIFO(RXFIFO)的一部分,共由 64字节长。有了 这个 FIFO,可以在 CPU 处理一个报文的同时继续接收其他到来的报文。
(4)接收滤波器:它把报文头中的标识符和接收滤波寄存器中的内容进行比较, 以判断文报文是否被接收。如果被接收,报文存入 RXFIFO。
(5)位流处理器:它是一个控制发送缓冲器、RXFIFO 并行数据和 CAN 总线(串 行数据)之间数据的序列发生器,同时它也执行错误检测、仲裁、位填充和 CAN 总线 错误处理功能。
(6)位定时逻辑不:它将 SJA1000同步于 CAN 总线上的位流。
(7)错误管理逻辑:它按照 CAN 协议完成错误界定。
由于 SJA1000与 PCA82C2000兼容,因此 SJA1000的缺省工作方式即基本 CAN 模 式与 82C200相同。下面介绍 SJA1000工作在增强 CAN 模式(PeliCAN)下的寄存器配
置。在初始化期间,芯片在复位模式(RESET MODE)时的寄存器配置如表 1所列,在 工作期间的运行模式(OPERATING MODE)下,部分寄存器的定义将有所更改,具体见 表 2。
表 2 SJA1000寄存器配置(工作模式)与表 1不同之外
名称 地址 7 6 5 4 3 2 1 0 16
RX/TX
帧信息
TX 帧
(写) RX 帧 (读) FF
FF
RTR
RTR
X
X
DLC.3
DLC.3
DLC.2
DLC.2
DLC.1
DLC.1
DLC.0 DLC.0
RX/TX报文 缓冲器 17~ 28
SJA1000的新增功能如下:
(1)支持 CAN2.0B 协议
SJA1000完全支持 CAN2.0B 协议,这意味着实现了扩展的振荡器容差和处理扩展 帧报文,在基本 CAN 方式中,仅可发送和接收标准帧报文(11位标识符) ,若检测到 CAN 总线上的扩展帧报文(29位标识符) ,他们将允许,并在确认报文正确后给予应 答, 但不会产生接收中断。 标识符作为报文的名称将被用于接收器的验收滤波过程中, 同时在仲裁处理期间,也用来确定总线访问的优先权。标识符二进制数值愈低,其优 先权愈高。
(2)扩展的接收缓冲器
利用 SJA1000可将原有的 PAC82C200双接收缓冲器被接收 FIFO 替代,并可用来 存储来自 CAN 总线上被接收和滤波的报文,作为 CPU 能访问的一个 FIFO 的 13字节窗 口,接收 FIFO 总长度为 64字节。通过 FIFO,CPU 可以在处理一个报文的同时接收其 它报文。
(3)增强的错误处理能力
在增强 CAN 模式功能中,SJA1000为增强错误处理功能增加了一些新的特殊功能 寄存器,包括:仲裁丢失捕捉寄存器(ALC) ,出错码捕捉寄存器(ECC) ,错误警告极 限寄存器(EWLR) ,RX 出错计数寄存器(RXERR)和 TX 出错计数寄存器(TXERR)等。 借助于这些错误寄存器可以找到丢失仲裁位的位置,分析总线错误类型和位置,定义
错失仲裁位的位置,分析总线错误类型和位置,定义错误警告极限值以及记录发送和 接收时出现错误的个数等。
(4)增强的验收滤波功能
SJA1000带有验收滤波器功能,它的作用是自动检查报文中的标识符和数字节。 通过设置滤波,与该总线节点不相关的一个报文或一组报文净不被 SJA1000所接收, 这样可以提高 CPU 的利用效率。在增强型 CAN 方式中,SJA1000还增加了单滤波方式 和双滤波方式,可以对标准帧和扩展帧实现更复杂的滤波功能
2.2.2.2基于SJA1000的控制电路设计
控制器SJA1000作为本接口电路中的控制部分,应用本设计中,对于SJA1000和单 片机的连接,引脚AD0~AD7是和89C51的输出输入脚P0.0~P0.7相接;SJA1000的片选 信号脚/CS必须 由微控制器的P2.7口控制否则这个片选输入必须接到VSS 也可以通过 地址解码控制例如当地址/数据总线用于其他外围器件 ,ALE对应ALE,读/写输入脚 /WR、/RD,/INT和单片机的/INT0连接,由于在该系统中要用到相同的时钟频率,所 以我们要时钟信号引脚CLKOUT和单片机的XTAL1脚相连,达到频率一致的目的;而在 复位信号的处理,可以在看门狗外围电路的RST信号输出后再通过和非门电路的相连, 很好的实现了电路的复位作用。而对于控制器的收发引脚TX0,TX1与RX0,RX1,在本 系统中TX0、 RX0可和收发器82C250的TXD、 RXD接通。 同时, 在和CPU接口中 SJA1000 支 持对两个著名的微型控制器系列的直接连接80C51 、68xx 。通过SJA1000 的MODE 引 脚可选择接口模式Intel 模式 MODE 高;Motorola 模式 MODE 低。在Intel 模式和 Motorola 模式里地址/数据总线和读/写控制信号的连接。本设计中,正是使用Intel 模式。对SJA1000的Vdd1~Vdd3电源输入脚,外接上驱动+5V电压;而Vss1~Vss3输出 接地。 设计中,对SJA1000提供16Mkz的晶振。电路设计如下
图 2-4 SJA1000控制电路
2.2.3 CAN总线收发电路设计
2.2.3.1CAN总线收发器 82C250介绍
82C250是 CAN 控制器与物理总线间的接口, 可以提供对总线的差动发送和接收能 力,与 IS011898标准完全兼容,并具有抗汽车环境下的瞬间干扰、保护总线的能力。 为了提高系统的可靠性和抗干扰能力, 在 CAN 控制器和 CAN 收发器之间采用光耦 6N137进行隔离
PCA82C250提供对物理总线的符合 CAN 电气协议的差动发送和接收功能,另外, 它具有的电流限制电路,还提供了对总线的进一步的保护功能。通过 82C250与物理
图 2-5 82C250引脚结构
总线进行连接,可使总线支持多达 110个节点的挂接。上图给出 PCA82C250的功能方 框图。对于 CAN 控制器及带有 CAN 总线接口的器件,82C250并不是必须使用的器件, 因为多数 CAN 控制器均具有配置灵活的收发接口并允许总线故障,只是驱动能力一般 只允许 20~30个节点连接在一条总线上。 而 82C250支持多达 110个节点, 并能以 1Mbps
的速率工作于恶劣电气环境。
图 2-6 PCA82C250配置
82C250有 8个管脚,其封装形式在本设计中采用 DIP 形式,各引脚功能如表 3:表 3 82C250引脚功能说明
管脚 符号 功 能 描 述
1 TXD 发送数据输入端, 接控制器的串行 数据输出端
2 GND 地
3 Vcc 电源电压:4.5V〈 Vcc〈 5.5V
4 RXD 接收数据输出端, 接控制器的串行 数据输入端
5 VREF 基准电压输出端
6 CANL 低电平输入/输出 端
7 CANH 高电平输入/输出 端
8 Rs 斜率控制电阻输 入端
表 4 82C250真值
电源
总线状态
RXD 高电平 低电平 支配
0 4.5<><5.5 1或悬浮="" 悬浮="" 悬浮="" 退让="" 1="">5.5><>
不定
悬浮 悬浮 退让 不定 悬浮 悬浮 退让 不定 2V<><>
不定
悬浮
悬浮
退让
不定
从表 4中可看出, CAN 总线驱动器 82C250和 RS485驱动器的主要区别在于传输 信号的电平上。 RS485驱动器的两个输出端分别向总线发送一对相异的电平,即一端 为高电平,另一端则为低电平。而 82C250输出端的电平不是相异的,在 CANH 端, 它的两个状态是高电平和悬浮状态; 而在 CANL 端, 它的两个状态则分别为低电平和 悬浮状态,这样一来即使多个节点同时向网络发送数据,也不会像 RS485那样发生短 路现象。
图2-7 PCA82C250/251 收发器的应用举例
输出控制 TX0推挽输出显性低 例如1Ahex
应用举例
PCA82C250/251 收发器的典型应用如图2-7所示协议控制器通过串行数据输出线 TX 和串行数据输入线RX 连接到收发器收发器通过有差动发送和接收功能的两个总 线终端CANH 和CANL 连接到总线电缆输入Rs 用于模式控制参考电压输出VREF的输出 电压是额定VCC 的0.5倍其中收发器的额定电源电压是5V。
协议控制器输出一个串行的发送数据流到收发器的TxD 引脚内部的上拉功能将 TxD 输入设置成逻辑高电平也就是说总线输出驱动器默认是被动的在隐性状态中见 图2-7CANH 和CANL 输入通过典型内部阻抗是17k 的接收器输入网络偏置到2.5V 的 额定电压另外如果TxD 是逻辑低电平总线的输出级将被激活在总线电缆上产生一个 显性的信号电平。输出驱动器由一个源输出级和一个下拉输出级组成CANH 连接到源 输出级CANL 连接到下拉输出级在显性状态中CAN_H 的额定电压是3.5V CAN_L是1.5V。
2.2.3.2基于82C250收发电路设计
82C250是CAN控制器与物理总线间的接口,可以提供对总线的差动发送和接收能 力,与IS011898标准完全兼容,并具有抗汽车环境下的瞬间干扰、保护总线的能力。 设计中,收发器的接受、发送脚原理上要和SJA1000的发送、接受脚相连接。但 这样一来,两者的电气不一致,造成电气隔离,给通信带来麻烦。为此,在它们之间 接上高速光耦合器6N137, 避开了电气隔离, 更好的实现通信联系。 82C250的TXD、 RXT 就对应接上6N137的输出脚OUT和输入脚IN;脚Rs作为斜率控制电阻输入端,电阻的大 小可以割据总线通信速度适当调整一般在16~140KΩ之间,设计中Rs阻值为47KΩ。 在通过接一个47K电阻分流之后, 可以接地。 电压引脚Vcc, 其 电源电压:4.5V 〈 Vcc〈 5.5V, 在设计中采用 5V 电压。 Vref 作为基准电压输出端,设计中可以接地。 而CANH, CANL脚是信号的 输入输出,实现对电平信号的传送,通过它们连接上双绞线,完成通信传输。电路大 致如下
图2-8 82C250收发电路
2.2.4复位、监控电路设计
2.2.4.1X5045P简介
本设计中,所应用到的复位电路采用 Xicor 公司产品 X5045P。X5045P 把四种常 用的功能:上电复位、看门狗定时器、电源电压监控和块锁(Block Lock TM )保护 的串行 EEPROM 存储器组成在一个封装之内。这种组合降低了系统成本、减少了电路 板空间和增加了可靠性。下图 2-9
为引脚图:
图 2-9 X5045P引脚配置
CS/WDI:片选输入 /看门狗复位输入;
SO :串行输出;
WP :写保护输入;
Vss :地;
Vcc :电源;
RESET :复位输出;
SCK :同步时钟输入;
SI :串行输入。
X5045P 的状态寄存器描述器件的当前状态,各位意义如表 5所列。
表 5 X5045P状态寄存器
其中,WD1、WD0是看门狗定时时间设置位;BL1、BL0是存储单元写保护区设置 位;WEL 是只读标志,1表明写使能开关打开;WIP 也是只读标志,1代表芯片内部正 处于写周期。电复位时,各位都被清零。
X5045P 芯片功能包括以下 4种:
(1)上电复位控制。在对 X5045P 通电时,ERSET 引脚输出有效的复位信号,并 保持至少 200ms,使 CPU 有效复位。
(2)电源电压监控。当检测到电源电压低于内部门槛电压 VTRIP 时,RESET 输出 复位信号,直至电源电压高于 VTRIP 并保持至少 200ms,复位信号才被撤消。VTRIP 的出厂值根据芯片型号不同共有 5个级别的电压范围。对于需要电源电压精确监控的 应用,用户可以搭建编程电路,对芯片内 VTRIP 电压进行微调。
(3)看门狗定时器。芯片内部状态寄存器的 WD1、WD0是看门狗定时设置位,通 过状态寄存器写指令 WRSR 修改这 2个标志位,就能在 3种定时间隔中进行选择或关 闭定时器。对看门狗的复位由 CS 输入电平的下降沿完成。表 6是 WD1、WD0组合的含 义
表 6 内部寄存器 WD1、WD0含义
WD1 WD0 看门狗定时值
0 0 1.4s
0 1 600ms
1 0 200ms
1 1 禁止看门狗工作
(4)串行 E2PROM。芯片内含 512字节存储单元,10万次可靠写,数据保持时间 100年。XICOR 设计了 3种保护方式防止误写。包括:WP写保护引脚,当引脚被拉低 时,内部存储单元状态寄存器都禁止写入;存储区域写保护模式,通过对状态寄存器 的 BL1、BL0位的设置,可以选择对不同的存储区域进行写保护;在进行任何写操作
前都必须打开写使能开关,而且在上电初始化写操作完成时,写使能开关自动关闭。 显然,在几方面的保护之下,产生误写的可能性极小,表 7是 BL1、BL0组合的含义。 表 7串行 E2PROM 的 BL1、BL0含义
BL1 BL0 写保护的单元地址
0 0 没有保护
0 1 180H~1FFH
1 0 100H~1FFH
1 1 000H~1FFH
对 X5045P 的操作是通过 4根口线 CS、 SCK、 SI 和 SO 进行同步串行通信来完成的。 SCK 是外部输入的同步时钟信号。 在对芯片定改指令或数据时, 时钟前沿将 SI 引脚信 号输入;在读邮数据时,时钟后沿将数据位输出到 SO 引脚上。数据的输入/输出都是 高位在先。
芯片内部共有 6条指令,如表 8所列。
表 8 X5045P内部指令
命令名称 命令格式 内 容
WREN 0000 0110 打开写使能开关
WRDI 0000 0100 关闭写使能开关
RDSR 0000 0101 读状态寄存器
WRSR 0000 0001 写状态寄存器
READ 0000 A8011 读存储单元
WRITE 0000 A8010 写存储单元
(1)WREN 和 WRDI 是写使能开关的开/关指令。它们都是单字节指令。
(2)RDSR 和 WRSR 是状态寄存器的读/写指令。在从 SI 输入指令后,RDSR 的执 行结果,即状态寄存器内容须从 SO 读出;而 WRSR 需要紧接着输入修改数据。 (3)READ 和 WEITE 是存储单元的读/写指令。输入指令后(指令码第三代表存储 单元地址的最高位) ,接着输入低八位地址,最后就可以连续读出或写入数据。其中, 读指针和写指针的工作方式完全不同, 读指针的全部 8位用来计数, 0FFH 溢出后变成 00H;写指针只用最低两位计数,XXXXXX11B 溢出后变成 XXXX XX00B,所以连续写的 实际结果是在 4个单元中反复写入。另外,由于 E2PROM 的写入时间长,所以在连续 两条写指令之间应读取 WIP 状态,只有内部写周期结束时才可输入下一条写指令。 X5045P 中的看门狗对系统提供了保护功能。当系统发生故障而超过设置时间时,
电路中的看门狗将通过 RESET 信号向 CPU 作出反应。X5045提供了三个时间值供用户 选择使用。它所具有的电压监控功能还可以保护系统免受低电压的影响,当电源电压 降到允许范围以下时,系统将复位,直到电源电压返回到稳定值为止。X5045P 的存储 器与 CPU 可通过串行通信方式接口,共有 4096个位,可以按 512 x 8个字节来放置 数据。
2.2.4.2基于X5045P的电路设计
X5045P 在本设计中做为复位、 监控电路使用, 虽然增加了电路连接的复杂和成本, 但对于电路的稳定和可靠性有起到很大的作用,是系统中不可缺少的部分。
对 X5045的操作是通过 4根口线 CS、SCK、SI 和 SO 进行同步串行通信来完成的。 SCK 是外部输入的同步时钟信号。 在对芯片定改指令或数据时, 时钟前沿将 SI 引脚信 号输入;在读邮数据时,时钟后沿将数据位输出到 SO 引脚上。数据的输入/输出都是 高位在先。在设计中,/CS脚和单片机 P1.0、SI、SCK、SO、RST 分别与单片机的引脚 P1.0~P1.3、RST
连接。对于不用到的引脚,可以直接和地相连。电路设计如下:
图 2-10 X5045P电路监控、复位电路
2.2.5电源设计
设计中,对系统的电源都一致采用 DC+5V电压,光耦部分电路所采用的两个电源 Vcc 和 Vdd 必须完全隔离。为此,设计电源如下所示:
图 2-11 电源电路
它由 AH805升压模块及 FP106升压模块组成。AH805是一种输入 1.2~3V,输出 5V 的升压模块,在 3V 电池供电时可输出 100mA
入 4~6V,输出固定电压为 29±1V,输出电流可达 40mA,AH805及 FP106都是一个电 平控制的关闭电源控制端。两节 1.5V 碱性电池输出的 3V 电压输入 AH805,AH805输 出+5V电压,其一路作 5V 输出,另一路输入 FP106使其产生 28~30V电压,经稳压管 稳压后输出+12V电压。从图中可以看出,只要改变稳压管的稳压值,即可获得不同的 输出电压,使用十分灵活。FP106的第⑤脚为控制电源关闭端,在关闭电源时,耗电 几乎为零,当第⑤脚加高电平>2.5V时,电源导通;当第⑤脚加低电平<0.4v时,电 源被关闭。可以用电路来控制或手动控制,若不需控制时,第⑤脚与第⑧脚连接。="" 2.3="">0.4v时,电>
见附录 1
在本电路原理中, 控制单元以单片机 AT89C51为核心, 选用器件 SJA1000作为 CAN 控制器,并选用芯片 82C250和 6N137、X5045P 作为 CAN 控制器接口和光耦合隔离、 复位电路。在实际中,应注意以下几个问题
1. SJA1000的中断请求信号 INT 在中断允许且有中断发生时,由高电来此跳变到 低电平, 所以 INT 和 AT0C51的 INT0直接相连。 片选信号 CS 和单片机引脚 P2.7相连, 当 CS 接到低电平时,SJA1000被选中,CPU 可对 SJA1000进行读/写操作。为了增强 CAN 总线节点的抗干扰能力。SJA1000的 TX1脚悬空,RX1引脚的电位必须维持在约 0.5V
CC
上,否则,将不能形成 CAN 协议要求的电平逻辑。
2. SJA1000的 TxD 和 RxD 并不是直接与 82C250的 TxD 和 RxD 相连而是通过高速 光耦合 6N137后与 82C250相连,这样就可以很好的实现了总线上个 CAN 节点的电气 隔离,不过应该特别说明一点的是光耦部分电路所采用的两个电源 Vcc 和 Vdd 必须完
全隔离,否则采用光耦也就失去了意思。电源的完全隔离可采用小功率电源隔离模块 或带多 5V 隔离输出的开关电源模块实现,这些部分虽然增加了节点的复杂,但是却 提高了节点的稳定性和安全性,保护 CAN 控制器正常工作。
3. 由于单片机和 SJA1000所用的工作频率不同,给设计带来麻烦。因此,在本 次设计中将 SJA1000的 CLOCKOUT 的时钟信号接至 AT89C51的时钟电路输入端,作为 AT89C51的外部时钟输入,解决了时钟同步问题。
4. 82C250是 CAN 总线收发器,是 CAN 控制器 SJA1000正常工作与 CAN 总线的接 口器件,是对 CAN 总线以差分方式发送,TXD 和 RXD 引脚分别发送经过驱动后的发送 和接收信号。其引脚 RS 用于选择 82C250的工作模式(高速、斜率或等待) 。RS 脚接 地,82C250工作于高速方式,RS 脚串接一个电阻 R 后再接地,若 82C250处于 CAN 总 线的网络终端, 总线接口部分必须加一个 120Ω的匹配电阻, 以保护 82C250免受过激 的冲击忽略掉它们,会使数据通信的抗干扰性及可靠性大大降低。本设计中,82C250的 CANH 和 CANL 引脚与地之间并联了两个 30pf 的小电容可以起到滤除总线上的高频 干扰和一定的防电磁辐射的能力
5. 另外在两根 CAN 总线接入端与地之间分别反接了一个保护二极管。当 CAN 总 线有较高的负电压时,通过二极管的短路可起到一定的过压保护作用,82C250的 Rs 脚上接一个斜率电阻。 电阻大小可以根据总线通信速度适当调整一般在 16—140KΩ之 间。
6. 另外,在本系统中应用到的芯片 X5045P 具有电源监控、看门狗等功能,还同 时输出高低电平的复位信号,分别输出到 AT89C51和 SJA1000的复位端,以满足本次 设计的要求 。
3 结束语
现场总线标准及其技术日益成为国际自动控制领域关注的一大焦点,其原因是它 改变了传统控制系统的结构,形成了全新的网络集成分布式控制系统。在我国,现场 总线已经发展到推广应用阶段,中国已经成为各种现场总线激烈争夺的重要战场。因 此研究现场总线技术及其产品就显得尤为重要。本文正是基于控制器 SJA1000和 82C250收发器的基础上,外接上看门狗电路芯片 X5045P 及高速光耦合器 6N137,设 计 CAN 总线接口电路,该电路理论上很好的实现了设计原理要求。该设计简单明了, 在电路实现时,还需考虑各模块间的接地、屏蔽等诸多问题。
参考文献
[1]. 饶运涛 邹继军 郑勇芳 著 现场总线 CAN 原理与应用技术 北京航空航天大学 出版社
2003年 6月第 1版
[2].邬宽明 编著 现场总线技术应用选编 北京航空航天大学出版社
1995年 2月第 2版
[3]. 邬宽明 编 CAN总线原理和应用系统设计 北京航空航天大学出版社
1996年 11月第 1版
[4].雷霖 编著 现场总线控制网络技术 北京:电子工业出版社
2004年 4月版
[5].夏德海 编著 现场总线技术上海:北京 中国电力出版社
2004年 2月
[6].邬宽明 著 CAN2.0B新控制器 SJA1000 《工业控制计算机》月刊 1991年第 1期
[7].葛林 周文华 著 CAN通信网络在汽车中的应用研究 浙江大学 《汽车技术》月 刊
2002年第 1期
[8].周宝龙 岳继光 萧蕴诗 著 基于 CAN 控制器的单片机农业温室控制系统的设计 上海同济大学电气工程系 《测控技术》双月刊
2000年第 12期
附录 1:接口电路总体电路原理图
转载请注明出处范文大全网 » [资料]i2c总线接口电路设
=(others=>