计算机组成.零件之间的通信.总线BUS

本文详细探讨了计算机总线的工作原理、组成、设计与实现、控制策略,包括总线的复用、电气特性、时间特性,以及总线仲裁和通信控制。通过对总线的理解,揭示了其在计算机系统中如何实现不同部件间的数据传输和协调控制。
  • 总线干嘛的?说白了就是用来传输数据的,在计算机的各个部件之间。比如我主存里存的数据CPU要用,需要一条线路传过去吧,CPU内部各个寄存器之间、寄存器与ALU、CU与各个部件之间等等等等很多地方,总之就是部件之间需要传输数据
  • 传输的数据分为三种,对应着三种功能的总线
    • 数据总线
    • 地址总线
    • 控制总线
  • 那么为何称为“总”线?那是因为大部分情况下,我们没办法把任意两个部件之间都连起来,因为部件的数量太多太多了
    • 所以我们只用一根总线来传输, 那么面临的第一个问题就是,怎么区分数据、地址、控制这三类呢??
    • 确实对于数据和地址有一种技术叫做总线复用,因为计算机是在时序的控制下工作,所以一根总线上的数据在不同的时间段内被规定为“数据”还是“地址”。对于控制信号还没有这样做的,,,
    • 还是分三根总线来吧
    • 那么又有一个问题,只有三根线的话,虽然可以区分是数据还是地址还是控制信号,但是对于众多的部件来说,它如何知道当前总线上传输的数据是不是给它的?因为一条数据线连接了所有的部件,A给B发送数据的时候上面的数据是给B的,对于其他部件是没用的、是错误的数据。
    • 所以说,就需要控制信号来控制嘛。A发送数据的时候,控制信号就只让B从数据总线接收数据,其他部件是不接收的。
  • 突然想到一个比喻,只是用来解释总线的工作原理,并非历史发展
    • 总线大概就像自来水管,自来水厂没办法给所有的家庭都铺设一条专门的管道,所以就只铺设一条管道连接起所有的家庭。每个家庭都有自己家庭的工作用来给社会做贡献,哪家需要用水,就可以随时打开自来水管取水。
    • 后来自来水厂买下了加油站,但是不想再铺设更多的线路,所以就仍旧用一根管道,但是告诉所有的家庭,只有在你收到了自来水的信号,从管道上才能取出你需要的自来水,收到的是汽油信号,取出来的就是汽油。信号的传输也需要一条线,所以就铺设了一条电线来传输信号
    • 事实证明这做是明智的,因为自来水厂经济越来越发达,逐渐买下了食用油厂、煤气厂、盐厂、汉堡厂等等等等,但是依旧使用一根管道就可以服务所有的家庭了,只不过需要传输的控制信号多一点,这比多铺设管道要省钱多了
    • 后来发现家庭之间的交换也比较频繁,既然有这么方便的总管道为什么不用呢?于是大家都在控制信号的控制下,被告知可以往管道上放东西的家庭就可以往管道上放东西,然后再通知谁来取东西。这些管道就变成了双向的通行,可以取也可以放。
  • 所以总线的一个很重要的特征就是,对挂在上面的部件是共享的。
    • 如果两个家庭之间达成私下交换的协议,或一个家庭和自来水厂有关系可以让人把东西专门开车送来,那相当于专门的通信通道,不能称之为总线
  • 对应到计算机上,这种总线就是“以分时形式共享一组电导线”来实现。
  • 废话太多了…

总线组成与特性

组成
  • 传输线、接口和总线控制器
    • 除了传输数据、地址和控制信号的信息线外,还有电源线和接地线来连接到每个部件,也有可能会有备用线来预防总线出故障
    • 接口由三态门和缓冲寄存器组成。三态门可以决定当前总线与这个部件的联通状态,三态门的输出可以是1、0和高阻抗三个状态,多一个EO使能来控制
    • 由于总线的共享性,所以需要一个总线控制器来控制总线的使用和分配,
特性

功能特性

  • 传输线按功能(传输的数据是个啥)分类
    • 地址总线
    • 数据总线
    • 控制总线

电气特性

  • 也就是传输方向了啦
    • 单向总线:只能一个方向传输数据。地址线单向就够了=、=
    • 双向总线:全双工和半双工
      • 全双工:同时可以双向的传输数据
      • 半双工:一个
### 通过LIN总线协议读取设备或模块的零件号 在LIN(Local Interconnect Network)总线通信中,读取设备或模块的零件号通常涉及特定的诊断服务或自定义消息帧设计。以下是实现这一功能的具体方法: #### LIN 总线中的诊断支持 LIN 协议本身并不直接提供标准的服务来读取零件号,但在实际应用中,制造商常会利用 **LIN 的诊断功能** 或者扩展报文结构来实现此目的。具体来说,可以通过以下几种方式获取零件号。 1. **SID (Service Identifier)** 使用 如果目标节点支持诊断模式,则可以发送标准化的诊断请求 SID(例如 `0x1A` 表示读取ECU识别码)。这可能返回一个包含供应商ID、功能版本和校验信息的数据流[^4]。 2. **PID (Parameter IDentifier)** 查询机制 零件号往往被编码成参数标识符 PID 中的一部分,在某些情况下,它可能是预设好的固定地址映射到某个信号位域里。例如: ```python # 假定使用 Python 和 CAN/LIN 工具库如 cantools 进行交互 import cantools db = cantools.database.load_file('lin_database.dbc') # 加载DBC文件 message = db.get_message_by_name('DiagnosticMessage') pid_request = { 'RequestType': 0x03, # 请求类型为读取零件编号 'DataLength': 6 # 数据长度字段填充至预期大小 } encoded_frame = message.encode(pid_request) print(encoded_frame.hex()) # 输出十六进制表示形式用于传输 ``` 3. **专用工具解析 LIN 报文** 利用专业的调试工具(比如 Vector’s CANoe/CANalyzer),能够捕获并解码来自网络上的所有有效负载数据包。一旦找到匹配的目标对象描述符,就可以进一步提取其中嵌入的信息片段作为最终结果呈现出来。 4. **硬件层面初始化过程中的广播行为捕捉** 当系统启动时,部分子单元可能会主动向主控端汇报自己的基本信息(类似于心跳检测),此时如果监听到了这样的事件序列,就有机会截获到所需的零部件唯一标志字符串[^2]。 综上所述,要成功地经由LIN接口取得关联部件的身份属性值,既依赖于底层物理层连接质量保障良好无误的同时还需要熟悉掌握高层协议栈的工作原理以便正确构建相应的查询指令集并向对方发出询问动作等待回应处理即可达成所愿[^1]。 ```python def read_part_number(lin_channel): """ Simulates reading part number from a LIN device. Args: lin_channel (str): The channel name or identifier of the LIN bus. Returns: str: Part Number retrieved from the LIN node. """ try: diagnostic_response = send_diagnostic_request(lin_channel, service_id=0x1A) supplier_info = parse_ecu_identification(diagnostic_response) return f"{supplier_info['vendor']}-{supplier_info['part_no']}" except Exception as e: raise RuntimeError(f"Failed to retrieve part number due to {e}") # Example usage with hypothetical function calls print(read_part_number("LIN1")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值