当前位置:首页 > spi
  • 金升阳研发出可实现UART/SPI转CAN双向数据通信的TD5(3)USPCAN系列

    金升阳研发出可实现UART/SPI转CAN双向数据通信的TD5(3)USPCAN系列

    一、产品简介 随着新能源汽车的迅速发展,电气化程度的提高和传感器技术的进步,车身总线由之前的2路CAN变成了4路甚至5路CAN的需求。针对传统板子上CAN接口不够的情形,金升阳开发了可以实现UART/SPI转CAN双向数据通信的产品——TD5(3)USPCAN系列。 TD5(3)USPCAN系列集微处理器、CAN收发器、电源隔离、信号隔离于一体。它可将UART/SPI信号转换为CAN总线差分电平,实现信号接口拓展、隔离;同时产品兼容UART/SPI接口,可以直接嵌入到UART/SPI设备中,在设备上拓展更多的CAN通信接口,实现设备和CAN总线网络之间数据通信。 二、产品应用 可广泛应用于汽车电子、充电桩、轨道交通、仪器仪表、工业通信、电力等行业。 产品典型应用电路图如下: 三、产品特点 ● 内置高效隔离电源 ● 两端隔离:3000VDC ● UART或SPI与CAN接口的双向数据通信 ● UART波特率高达921.6Kbps、SPI速率高达1.5Mbit/s、CAN波特率高达1Mbps ● 工作温度范围:-40℃ to +85℃ ● 支持透明转换、透明带标识转换、自定义协议转换三种协议转换 ● 同一网络可支持连接110个节点 ● 集隔离与ESD总线保护功能于一身 四、产品清单: 用户可以通过上位机的USB或RS-232转UART,进行产品配置; 应用笔记和配置软件可在官网下载。 评估板仅实现UART与USB/RS-232之间的物理电平转换及模块配置端口上下拉功能,用户也可自行设计。 详细产品技术参数请参考技术手册: TD5(3)USPCAN 产品型号详细信息展示:

    时间:2020-05-26 关键词: uart can 数据通信 新能源汽车 spi

  • 隔离式SPI通信如何去实现

    隔离式SPI通信如何去实现

    监测和控制不同的系统需要能够直接访问传感器和驱动器,最好是从一个中心位置,采用标准化通信方法(例如串行外设接口(SPI))进行访问。SPI是一种同步串行数据总线,帮助设备和中央控制单元之间进行长距离的数据交换。通信操作遵从主从原则,是全双工的。SPI接口包含三行:SDI、SDO和SCK。 SPI通信方法适用的线缆距离不超过10米,通信距离更长时,通常需要用到中继器,这是因为随着线缆增长,其线缆阻抗相应增加,由此导致信号衰减。然后必须再次放大信号。与此同时,线路会获得更高的信噪比(SNR)。可利用ADI公司提供的isoSPI通信接口IC LTC6820 等器件来读取这些信号。 得益于该器件的创新式设计,可以使用双绞线电缆和适用的变压器来增强电气隔离,由此相对轻松地最大化SPI通信。 由于工业环境通常比较恶劣,所以需要使用电气隔离通信部件来保护用户免受危险电压影响,同时确保系统的可靠性。此外,尽管偶尔会出现共模电压,隔离也可以帮助实现精确测量。因此,要将输入级与系统的其余级分隔开来,同时仍然实现连接,隔离栅的使用就非常关键。 图1显示了所有从服务器如何受一个主服务器控制。主服务器和从服务器可以是微控制器或ADC,通常通过自身的SPI接口与传感器或微控制器连接。因此,LTC6820能够在两个完全电气隔离的器件之间实现SPI通信所需的双向数据传输。它将来自主服务器的SPI信号编码为速率最高1 Mbps的差分信号,然后通过电气隔离栅和双绞线传输。到了电缆另一端之后,差分信号再次由LTC6820接收并解码为SPI信号,然后再路由到从服务器总线。LTC6820还提供驱动信号通过隔离栅所需的电流。这些电流通过外部电阻,调整为符合系统要求的值,例如所需的线缆长度、SNR和抗扰度。 图1.隔离式SPI接口,通过共用的主控制器来控制多个电路板(从控制器)。 但是请注意,虽然使用了SPI中继器,数据速率仍是有限的,取决于电缆长度。例如,图1中使用100米CAT5电缆的电路的数据速率仅为0.5 Mbps左右,是LTC6820所能提供的1 Mbps最大值的一半(见图2)。 图2.使用CAT5电缆时,数据速率与电缆长度的关系。 通过使用isoSPI通信IC,可以简化远距离隔离传输SPI通信信号电路的复杂性,因为可以省去传统电路通常需要的大量组件。此外,使用LTC6820可以实现最长100米的通信距离(在工业设置中并不少见)。LTC6820还可轻松实现菊花链应用(一个主控制器控制多个从控制器)。而且,该器件非常适合电池监测系统应用,这是因为电池监测系统包含部分可能存在爆炸风险的充电单元(例如,锂离子电池),需要实施电气隔离通信。

    时间:2020-05-01 关键词: 通信 控制器 spi

  • 轻松实现隔离式SPI通信

    轻松实现隔离式SPI通信

    得益于该器件的创新式设计,可以使用双绞线电缆和适用的变压器来增强电气隔离,由此相对轻松地最大化SPI通信。 由于工业环境通常比较恶劣,所以需要使用电气隔离通信部件来保护用户免受危险电压影响,同时确保系统的可靠性。此外,尽管偶尔会出现共模电压,隔离也可以帮助实现精确测量。因此,要将输入级与系统的其余级分隔开来,同时仍然实现连接,隔离栅的使用就非常关键。 图1显示了所有从服务器如何受一个主服务器控制。主服务器和从服务器可以是微控制器或ADC,通常通过自身的SPI接口与传感器或微控制器连接。因此,LTC6820能够在两个完全电气隔离的器件之间实现SPI通信所需的双向数据传输。它将来自主服务器的SPI信号编码为速率最高1 Mbps的差分信号,然后通过电气隔离栅和双绞线传输。到了电缆另一端之后,差分信号再次由LTC6820接收并解码为SPI信号,然后再路由到从服务器总线。LTC6820还提供驱动信号通过隔离栅所需的电流。这些电流通过外部电阻,调整为符合系统要求的值,例如所需的线缆长度、SNR和抗扰度。 图1.隔离式SPI接口,通过共用的主控制器来控制多个电路板(从控制器)。 但是请注意,虽然使用了SPI中继器,数据速率仍是有限的,取决于电缆长度。

    时间:2020-03-07 关键词: spi

  • 轻松实现隔离式SPI通信

    轻松实现隔离式SPI通信

    监测和控制不同的系统需要能够直接访问传感器和驱动器,最好是从一个中心位置,采用标准化通信方法(例如串行外设接口(SPI))进行访问。SPI是一种同步串行数据总线,帮助设备和中央控制单元之间进行长距离的数据交换。通信操作遵从主从原则,是全双工的。SPI接口包含三行:SDI、SDO和SCK。 SPI通信方法适用的线缆距离不超过10米,通信距离更长时,通常需要用到中继器,这是因为随着线缆增长,其线缆阻抗相应增加,由此导致信号衰减。然后必须再次放大信号。与此同时,线路会获得更高的信噪比(SNR)。可利用ADI公司提供的isoSPI通信接口IC LTC6820 等器件来读取这些信号。 得益于该器件的创新式设计,可以使用双绞线电缆和适用的变压器来增强电气隔离,由此相对轻松地最大化SPI通信。 由于工业环境通常比较恶劣,所以需要使用电气隔离通信部件来保护用户免受危险电压影响,同时确保系统的可靠性。此外,尽管偶尔会出现共模电压,隔离也可以帮助实现精确测量。因此,要将输入级与系统的其余级分隔开来,同时仍然实现连接,隔离栅的使用就非常关键。 图1显示了所有从服务器如何受一个主服务器控制。主服务器和从服务器可以是微控制器或ADC,通常通过自身的SPI接口与传感器或微控制器连接。因此,LTC6820能够在两个完全电气隔离的器件之间实现SPI通信所需的双向数据传输。它将来自主服务器的SPI信号编码为速率最高1 Mbps的差分信号,然后通过电气隔离栅和双绞线传输。到了电缆另一端之后,差分信号再次由LTC6820接收并解码为SPI信号,然后再路由到从服务器总线。LTC6820还提供驱动信号通过隔离栅所需的电流。这些电流通过外部电阻,调整为符合系统要求的值,例如所需的线缆长度、SNR和抗扰度。 图1.隔离式SPI接口,通过共用的主控制器来控制多个电路板(从控制器)。 但是请注意,虽然使用了SPI中继器,数据速率仍是有限的,取决于电缆长度。例如,图1中使用100米CAT5电缆的电路的数据速率仅为0.5 Mbps左右,是LTC6820所能提供的1 Mbps最大值的一半(见图2)。 图2.使用CAT5电缆时,数据速率与电缆长度的关系。 通过使用isoSPI通信IC,可以简化远距离隔离传输SPI通信信号电路的复杂性,因为可以省去传统电路通常需要的大量组件。此外,使用LTC6820可以实现最长100米的通信距离(在工业设置中并不少见)。LTC6820还可轻松实现菊花链应用(一个主控制器控制多个从控制器)。而且,该器件非常适合电池监测系统应用,这是因为电池监测系统包含部分可能存在爆炸风险的充电单元(例如,锂离子电池),需要实施电气隔离通信。

    时间:2020-03-06 关键词: 传感器 驱动器 spi

  • 兆易创新与贸泽电子签署全球分销协议,支持现货即发

    中国北京(2020年1月16日)—业界领先的半导体器件供应商兆易创新GigaDevice今日宣布与领先的半导体和电子元件分销商贸泽电子(Mouser Electronics)签署全球分销协议。此次与贸泽电子达成战略合作关系,有助于进一步扩大兆易创新的SPI NOR、SPI NAND及Parallel NAND Flash等丰富产品线的覆盖范围和供货能力,从而更方便快捷地向全球设计工程师和采购者提供产品。兆易创新高可靠性的GD25SPI NOR Flash具有从512Kb至1Gb不同容量的选择,可提供四种电压规格和多种封装形式,包括高达8Mbit的业界最小USON封装(1.5mm x 1.5mm)和WLCSP封装。兆易创新GD5F SPI NAND和GD9F Parallel NAND产品采用1.8V和3.3V供电,可分别提供1Gb、2Gb、4Gb和8Gb的产品容量。NOR Flash和NAND Flash产品均为低功耗和高性能嵌入式应用而设计,例如工业、消费电子、物联网、移动、计算、网络及通信。兆易创新全系列SPI NOR Flash产品均已通过AEC-Q100标准认证,适用于汽车领域应用。兆易创新执行副总裁、存储器业务部门总经理舒清明先生表示:“贸泽电子不仅专注于快速向设计工程师和采购商推出新产品,还能够提供优质的客户服务。我们很高兴与贸泽电子携手合作,让全球客户能够更方便快捷地采购我们的创新型Flash产品。”

    时间:2020-01-16 关键词: spi 贸泽电子 全球分销协议

  • 操纵MCU SPI接口以访问非标准SPI ADC

    操纵MCU SPI接口以访问非标准SPI ADC

    当前许多精密模数转换器(ADC)具有串行外设接口(SPI)或某种串行接口,用以与包括微控制器单元(MCU)、DSP和FPGA在内的控制器进行通信。控制器写入或读取ADC内部寄存器并读取转换码。SPI的印刷电路板(PCB)布线简单,并且有比并行接口更快的时钟速率,因而越来越受欢迎。而且,使用标准SPI很容易将ADC连接到控制器。 一些新型ADC具有SPI,但有些ADC具有非标准的3线或4线SPI作为从机,因为它们希望实现更快的吞吐速率。例如,AD7616、AD7606和AD7606B系列有两条或四条SDO线,在串行模式下可提供更快的吞吐速率。AD7768、AD7779和AD7134系列有多条SDO线,用作SPI主机。用户在设计微控制器SPI以配置ADC和读取代码时往往会遇到困难。 图1.AD7768用作串行主机,具有两个数据输出引脚(14001-193)。 与ADC的标准MCU SPI连接 SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。图2显示了典型的4线MCU SPI接口连接。 要开始SPI通信,控制器必须发送时钟信号,并通过使能信号(通常是低电平有效信号)来选择ADC。SPI是全双工接口,因此控制器和ADC可以分别通过MOSI/DIN和MISO/DOUT线同时输出数据。控制器SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。为了在主机和从机之间进行可靠的通信,用户必须遵守微控制器和ADC芯片的数字接口时序规范。 如果微控制器SPI和ADC串行接口具有标准SPI时序模式,那么用户设计PCB布线和开发驱动器固件不成问题。但是,有些新型ADC的串行接口端口不是典型的SPI时序模式。MCU或DSP似乎不可能通过AD7768串行端口(一种非标准时序SPI端口)读取数据,如图4所示。 本文将介绍操纵标准微控制器SPI以便与具有非标准SPI端口的ADC接口的方法。 本文会给出四种通过串行接口读取ADC码的解决方案: 解决方案1:MCU作为SPI从机,通过一条DOUT线与作为SPI主机的ADC接口。 解决方案2:MCU作为SPI从机,通过两条DOUT线与作为SPI主机的ADC接口。 解决方案3:MCU作为SPI从机,通过DMA与作为SPI主机的ADC接口。 解决方案4:MCU作为SPI主机和SPI从机,通过两条DOUT线读取数据。

    时间:2020-01-02 关键词: MCU spi 电源资讯

  • 操纵MCU SPI接口以访问非标准SPI ADC

    操纵MCU SPI接口以访问非标准SPI ADC

    问题:能否用MCU访问非标准SPI接口?答案:可以,但可能需要做一些额外的努力。简介当前许多精密模数转换器(ADC)具有串行外设接口(SPI)或某种串行接口,用以与包括微控制器单元(MCU)、DSP和FPGA在内的控制器进行通信。控制器写入或读取ADC内部寄存器并读取转换码。SPI的印刷电路板(PCB)布线简单,并且有比并行接口更快的时钟速率,因而越来越受欢迎。而且,使用标准SPI很容易将ADC连接到控制器。一些新型ADC具有SPI,但有些ADC具有非标准的3线或4线SPI作为从机,因为它们希望实现更快的吞吐速率。例如,AD7616、AD7606和AD7606B系列有两条或四条SDO线,在串行模式下可提供更快的吞吐速率。AD7768、AD7779和AD7134系列有多条SDO线,用作SPI主机。用户在设计微控制器SPI以配置ADC和读取代码时往往会遇到困难。图1.AD7768用作串行主机,具有两个数据输出引脚(14001-193)。与ADC的标准MCU SPI连接SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。图2显示了典型的4线MCU SPI接口连接。图2.与ADC从机的标准MCU SPI连接要开始SPI通信,控制器必须发送时钟信号,并通过使能信号(通常是低电平有效信号)来选择ADC。SPI是全双工接口,因此控制器和ADC可以分别通过MOSI/DIN和MISO/DOUT线同时输出数据。控制器SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。为了在主机和从机之间进行可靠的通信,用户必须遵守微控制器和ADC芯片的数字接口时序规范。如果微控制器SPI和ADC串行接口具有标准SPI时序模式,那么用户设计PCB布线和开发驱动器固件不成问题。但是,有些新型ADC的串行接口端口不是典型的SPI时序模式。MCU或DSP似乎不可能通过AD7768串行端口(一种非标准时序SPI端口)读取数据,如图4所示。本文将介绍操纵标准微控制器SPI以便与具有非标准SPI端口的ADC接口的方法。本文会给出四种通过串行接口读取ADC码的解决方案:·解决方案1:MCU作为SPI从机,通过一条DOUT线与作为SPI主机的ADC接口。·解决方案2:MCU作为SPI从机,通过两条DOUT线与作为SPI主机的ADC接口。·解决方案3:MCU作为SPI从机,通过DMA与作为SPI主机的ADC接口。·解决方案4:MCU作为SPI主机和SPI从机,通过两条DOUT线读取数据。图3.SPI数据时钟时序图示例图4.AD7768FORMATx=1×时序图,仅通过DOUT0输出。STM32F429微控制器SPI通过一条DOUT线读取AD7768代码如图4所示,当FORMATx=11或10时,通道0至通道7仅通过DOUT0输出数据。在标准工作模式下,AD7768/AD7768-4作为主机工作,数据流入MCU、DSP或FPGA。AD7768/AD7768-4向从机提供数据、数据时钟(DCLK)和下降沿帧使能信号(DRDY)。STM32Fxxx系列微控制器广泛用于很多不同的应用中。该MCU有多个SPI端口,可以使用典型的SPI时序模式将其配置为SPI主机或从机。下文中介绍的方法也可应用于其他具有8位、16位或32位帧的微控制器。AD7768/AD7768-4分别为8通道和4通道同步采样Σ-Δ型ADC,每通道均有Σ-Δ型调制器和数字滤波器,支持交流和直流信号的同步采样。这些器件在110.8kHz的最大输入带宽下实现了108dB动态范围,具备±2ppm INL、±50µV偏置误差和±30ppm增益误差的典型性能。AD7768/AD7768-4用户可在输入带宽、输出数据速率和功耗之间进行权衡,并选择三种功耗模式之一以优化噪声目标和功耗。AD7768/AD7768-4的灵活性使其成为适合低功耗直流和高性能交流测量模块的可重复使用平台。遗憾的是,AD7768的串行接口不是典型SPI时序模式,而且AD7768充当串行接口主机。一般而言,用户必须使用FPGA/CPLD作为其控制器,例如,使用32F429IDISCOVERY和AD7768评估板。变通SPI线的连接如图5所示。在这种设置下,AD7768的所有八通道数据仅通过DOUT0输出。图5.AD7768通过DOUT0将数据输出到STM32F429MCU SPI连接需要解决的问题:·AD7768用作SPI主机,故必须将STM32F429I SPI配置为SPI从机。·高电平脉冲只持续一个DCLK周期,这不是典型的。·完成所有通道数据位的输出之后,DCLK继续输出,为低电平。解决方案1:MCU SPI作为从机,通过一条DOUT线与SPI主机ADC接口·将STM32F429的一个SPI端口(如SPI4)配置为从机,以DCLK速率接收MOSI上的数据位。·将AD7768连接到STM32F429外部中断输入引脚EXTI0和NSS(SPI)引脚。的上升沿将触发EXTI0处理例程,以使SPI从机能够在变为低电平之后的第一个DCLK下降沿开始接收数据位。时序设计在这里至关重要。·接收到通道0至通道7的所有数据后,应禁用SPI以防止读取额外的无效数据,因为会使SPI从机变为低电平,并且DCLK保持切换。图6.时序解决方案中的AD7768数据位读取MCU固件开发注意事项当软件处于中断模式时,DCLK运行速率可以高达4MHz,实现8kSPS的ODR。软件应进入中断处理程序,在一个半DCLK周期(375ns)内启动SPI。为使软件更轻松地进入中断例程,MCU可以在DCLK上升沿读取数据,从而提供额外的半个DCLK周期时间。但是,t5DCLK上升到DOUTx无效最小值为–3ns(IOVDD=1.8V时为–4ns),因此DOUTx上的传播延迟(>|t5|+MCU保持时间)应通过PCB布线或缓冲增加。图7.配置SPI4外设解决方案2:MCU SPI作为从机,通过两条DOUT线与SPI主机ADC接口在第一种解决方案中,仅使用DOUT0来输出所有8通道数据。因此,数据读取将ADC吞吐速率限制为8kSPS。如图1所示,在DOUT0上输出通道0至通道3,在DOUT1上输出通道4至通道7,可以减少数据传输时间。串行线的连接如图7所示。通过这种改进,在DCLK为4MHz时,ODR可以轻松达到16kSPS。图8.AD7768通过DOUT0和DOUT1将数据输出到STM32F429MCU SPI连接固件可以不使用中断模式,而使用轮询模式,以减少从上升沿触发到使能SPI接收数据的时间延迟。这样可以在DCLK为8MHz时实现32kSPS的ODR。解决方案3:MCU SPI作为从机,通过DMA与SPI主机ADC接口直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。DMA可以迅速移动数据而不需要任何MCU操作,这样可以腾出MCU资源用于执行其他操作。下面是MCU SPI用作从机通过DMA接收数据的设计说明。解决方案4:MCU SPI作为主机和从机,通过两条DOUT线读取数据高吞吐量或多通道精密ADC为SPI端口提供两条、四条甚至八条SDO线,以在串行模式下更快地读取代码。对于具有两个或更多个SPI端口的微控制器,这些SPI端口可以同时运行以加快代码的读取。图9.EXTI0处于轮询模式,SPI4和SPI5通过DOUT0和DOUT1接收AD7768数据位。图10.EXTI0处于轮询模式,SPI4DMA通过DOUT0接收AD7768数据位。在以下使用案例中,32F429IDISCOVERY使用SPI4作为SPI主机,SPI5作为SPI从机,通过DOUTA和DOUTB接收EVAL-AD7606B-FMCZ数据,如图8所示。AD7606B是一款16位同步采样模数转换数据采集系统(DAS),具有八个通道,每个通道均包含模拟输入箝位保护、可编程增益放大器(PGA)、低通滤波器和16位逐次逼近寄存器(SAR)型ADC。AD7606B还内置灵活的数字滤波器、低漂移2.5V精密基准电压源和基准电压缓冲器,可驱动ADC及灵活的并行和串行接口。AD7606B采用5V单电源供电,支持±10V、±5V和±2.5V真双极性输入范围,所有通道均能以800kSPS的吞吐速率采样。图11.在主从模式下使用MCU SPI通过DOUTA和DOUTB接收数据图12.SPI4配置为主机,SPI5配置为从机。图13显示了AD7606B以240kSPS运行时BUSY、SCLK、DOUTA和DOUB的数字接口截图。图13.AD7606B BUSY、SCLK以及DOUTA和DOUTB上的数据的示波器截图结论本文讨论了使用微控制器SPI访问具有非标准SPI接口的ADC的方法。这些方法可以直接使用,也可以稍加调整即可控制ADC SPI;其可作为SPI主机使用,也可以与多条DOUT线配合使用以提高吞吐速率。

    时间:2020-01-02 关键词: MCU spi adc

  • 掌控系统功能安全,单IC解决方案完美应对“成本”和“故障”双挑战

    掌控系统功能安全,单IC解决方案完美应对“成本”和“故障”双挑战

    还记得2019年3月发生的那起空难事件吗?埃塞俄比亚航空公司一架编号为ET302的航班从亚的斯亚贝巴起飞,在起飞6分钟后就失去联系并坠毁,机上149名乘客8名机组人员共计157人全部遇难。此后,事故的调查结果表示:这起事故是智能化系统功能错误导致的飞机失控,属功能安全事故。所谓功能安全就是当安全相关系统发生故障或者错误,不会导致安全机制的失效,从而避免人身和财产的损失。随着自动化技术的普及,人们对系统功能安全的要求显著增长。从核电站到医疗设备,无故障系统已成为部分应用的理想选择,也是其他应用的必备条件。在传感领域更是如此,获取的数据如果不正确或遭到损坏,结果可能具有破坏性,甚至可能致命。于是将诊断和故障预防机制集成到其产品当中,确保来自传感IC的数据的完整性成为了产品设计的必要步骤。不过随之而来的是PCB面积、物料成本和处理开销增加导致的成本高昂等一系列问题。对此,全球领先的高性能模拟技术解决方案提供商ADI提出通过高性能、高精准度的ADC实现功能安全的解决思路。突破传统瓶颈,ADI单IC解决方案降本增效早在多年前,以数据采集ADC为核心的功能安全系统就已经被推出了,其负责转换模拟输入并将数据传输到微控制器。然而,这种多组件功能安全系统采用许多外部元件,重复执行SPI事务,甚至需要一个冗余ADC,极大地增加了物料成本、PCB面积、处理开销和成本。同时还会给系统设计人员带来额外的负担,比如,增加开发时间,降低可靠性等。此外,在传统的以ADC为核心的数据采集系统中,可能发生多种故障。例如:·ADC电源错误:电源电压低,低压差(LDO)调节器的输出电压低。·模拟前端(AFE):传感器受损,或放大器驱动到ADC的电压不正确。·数字逻辑:数字域中发生可能影响转换结果的误码。例如,工厂增益或偏移调整系数。·SPI传输:由于传输线环境嘈杂,转换数据的传输和命令的接收中存在误码。·环境:超出IC的额定环境温度。对此ADI推出了一种单IC解决方案,只需极少的外部元件即可运行功能安全特性,其中一款就是低功率、高性能Σ-Δ模数转换器AD7768-1,实现了许多内部错误检测器,这样可以简化功能安全系统的设计,使整体复杂度低于其他解决方案。它是ADI公司功能安全产品组合中的Σ-ΔADC之一,其具有一个Σ-Δ调制器和数字滤波器,可实现AC和DC信号的精确转换。AD7768-1是AD7768的单通道版本,在AC和DC综合性能方面建立了全新的行业标准,并使仪器仪表和工业系统设计人员能够针对隔离式和非隔离式应用跨多个测量变量进行设计。多组件功能安全系统VS ADI单芯片集成六大数据采集系统故障源,ADI这样破!借助基于AD7768-1的ADC功能安全产品组合,可以使能多个诊断特性,赋予用户误码检测和诊断以及其他能力,通过寄存器映射将其状态告知用户。发生故障时,在寄存器中设置错误标志,这样可以降低故障发生几率,帮助用户诊断和减少系统错误。例如:ADC电源错误当工作环境温度高,系统功率循环引起电流冲击,那么负责ADC的LDO电源输出的LDO电容将会磨损和损坏,转换后的ADC数据或其他功能的性能会出乎意料。不过AD7768-1通过使能LDO监视器,一旦电压电平降至某个跳变点以下,系统会设置错误标志以提醒用户LDO输出的问题。模拟前端错误如果用户意外将不正确的值编程到增益寄存器,导致ADC看到的电压大于满量程范围,结果就会极大地影响系统的增益误差性能,这是一种极为严重的风险。但是,滤波器饱和错误检查器监视ADC输出,会提醒用户注意超出范围的模拟输入。数字逻辑随机误码如果在上电期间加载默认出厂失调设置时发生了一个误码,它会扰乱系统的默认失调误差,影响转换结果。在基于AD7768-1的ADC功能安全产品中,有功能可以定期在各种存储器模块上运行循环冗余校验(CRC),并在发生误码时向用户指示故障。通过重置系统可以解决所有这些故障。SPI传输错误当电磁干扰被传导到SPI线路上,会导致转换ADC数据传输中出现误码。如果压力室中,ADC数据的误码可能造成极大的破坏性。不过可以通过在发送数据的末尾附加CRC,用户能够识别传输期间是否发生了误码,并且可以重新检查ADC转换结果。外部主时钟错误如果用户需要在压力传感器应用中拒绝主电源的频率(50Hz/60Hz),那么精确的低抖动外部主时钟源对于将数字滤波器陷波与正确的频率对齐至关重要。如果源断开、破损或损坏,结果会成为一个大问题,因为主电源的某些频率成分可能在转换后的ADC数据中可见。如果外部时钟源未成功连接或已被移除,则外部时钟认定器可向用户指示错误。然后,用户可以使用内部RC振荡器执行紧急转换,同时在外部主时钟源上执行基本维护。POR标志系统上电或成功复位后,ADC中的POR标志将置1。但如果发生意外复位,用户可能会在ADC数据中看到意外结果。他们可以通过检查POR标志来识别这种意外复位。AD7768-1的内部诊断监视器。结语许多行业对功能安全的要求不断提高,为保证功能安全,提高系统/模块监视和诊断覆盖率,以降低未检出错误的数学概率是必不可少的。不过提高覆盖率的较简单方法是增加冗余,但这会给系统带来多方面的不利影响,尤其是成本。AD7768-1可以大幅减轻客户的负担,并且更紧凑、更简单,满足所需解决方案对物料成本的要求。这种单一组件模式还可以减轻系统设计师的负担,帮助他们取得设计安全完整性等级(SIL)认证。

    时间:2019-12-24 关键词: spi adc 单ic

  • ENTEGRIS中国技术中心盛大开幕

    ENTEGRIS中国技术中心盛大开幕

    中国上海,2019年11月13日—特种化学品和先进材料解决方案的领军企业Entegris Inc.今天举行庆典活动,庆祝其中国技术中心盛大开幕。Entegris中国技术中心盛大开幕,从左至右依次是:Entegris中国技术中心技术总监江平、Entegris副首席技术长Montray Leavy、Entegris高级副总裁及首席技术官Jim O’Neill、Entegris执行副总裁及首席运营官Todd Edlund、Entegris执行副总裁及首席财务官Greg Graves、Entegris高级副总裁及首席商务官Michael Besnard、Entegris中国总经理张凯翔、Entegris市场战略副总裁杨文革Entegris执行副总裁及首席运营官Todd Edlund先生致欢迎词,展望新落成的四大实验室对本地客户强有力的支持,增强在华服务能力,推动构筑半导体行业生态圈Entegris高级副总裁及首席技术官Jim O’Neill博士畅谈Entegris在创新领域的投入和实践,建立服务网络以响应不断变化的用户需求,为本地和全球的客户创造更大的价值Entegris中国总经理张凯翔博士致辞,Entegris加强在华投资并践行对中国市场承诺Entegris中国技术中心座落于中国硅谷上海张江,中心的落成运营进一步提升了公司的在华技术能力。该中心配备了四大实验室:微污染物控制应用实验室、先进材料处理应用实验室、表面处理和集成应用(SPI)实验室、分析和计量实验室。Entegris中国技术中心配备了四大实验室,包括微污染物控制应用实验室、先进材料处理应用实验室、表面处理和集成应用(SPI)实验室、分析和计量实验室中国技术中心能够促进协作并更好地为Entegris的本地客户提供支持。四大实验室提供的专业技能,是打造半导体制造生态圈的关键环节Entegris中国技术中心的四大实验室进一步提升了公司的在华技术能力和服务效率,中心能够更快地响应客户的分析和应用需求,始终致力于为客户找到最具创新性的解决方案凭借在华逾25载的运营经验,Entegris始终稳步扩大本地足迹,在上海、北京、西安、厦门和武汉均设有办事处,并在众多地区设有销售和服务机构,为来自全中国的客户提供服务。Entegris执行副总裁兼首席运营官Todd Edlund表示:“我们之所以投入巨资建立中国技术中心,旨在服务半导体、平板显示(FPD)、OLED、LCD以及喷墨打印等众多行业的本地客户。同时,我们希望继续扩展技术能力,覆盖生命科学、制药及医疗等领域。”Entegris中国技术中心的四大实验室,致力于解决半导体制造生态系统中客户面临的各种问题,为该地区的客户提供广泛的分析和技术支持。

    时间:2019-11-14 关键词: spi 中国技术中心

  • 电路仿真软件详谈(十二),proteus电路仿真软件的SPI实例

    电路仿真软件详谈(十二),proteus电路仿真软件的SPI实例

    对于电路仿真软件,小编曾介绍过诸多相关内容,如电路仿真软件proteus的优点、电路仿真软件proteus与protel的区别、采用proteus电路仿真软件绘制PCB等。本文中,同样以proteus电路仿真软件为依托,为大家讲解基于proteus的SPI接口的设计与实现,一起来了解下吧。 1 Proteus简介 Proteus软件是英国Labcenter electronics公司的EDA工具软件,是一个电子设计的教学平台、实验平台和创新平台,涵盖了电工电子实验室、电子技术实验室、单片机应用实验室等的全部功能。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的特点是: ①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 ②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及Phil-lips公司的arm(LPC系列)等。 ③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil、ADS等软件。 ④具有强大的原理图绘制功能。能够进行SCH(原理图)和PCB(印刷板)电路的设计。 2 Proteus环境下的原理图设计 Proteus和Protel、EWB等软件相似,绘制原理图都要先从器件库里取出所需的元器件符号并在绘图区布局好,同时编辑好元件的参数,接着进行连线,添加必要的网络标号等步骤。下面通过一个简单的实例说明如何使用Proteus软件实现arm(以LPC2106为例)系统的设计与仿真。实例以 LPC2106控制器为核心,使用硬件SPI接口与74HC595进行连接,添加必要的外围电路,控制74HC595驱动LED数码管显示。电路原理如图 1所示。LPC2106的P0.4(/SCK/CAP0.1)、P0.6(/MOSI/CAP0.2)和P0.8(/TxD1/PWM4)分别与 74HC595的SH_CP、DS和ST_CP相连来控制74HC595,74HC595的输出Q0~Q6分别与数码管和LED相连,控制它们的实时显示。 3 程序代码的编写 程序代码的编写主要分4个部分进行: ①LPC2106的初始化代码; ②LPC2106异常向量入口及异常向量与C语言代码的接口,包括初始化堆栈的代码; ③LPC2106目标板特殊的代码,包括异常处理程序和目标板初始化程序; ④根据实例要求并结合原理图,编写实现预期功能的代码,即通常的执行代码,代码文件保存为“main.C”。 通常为了节省开发的时间,一般用设计好的工程模板,这里使用LPC2100系列工程模板。模板中包含LPC2100系列ARM7微控制器的启动文件,包括 STACK.S、HEAP.S、STARTUP.S和TARGET.C;模板还包含LPC2100系列arm7微控制器的头文件,分散加载描述文件(如 mem_a.scf、mem_b.scf和mem_c.scf)等等。这样在以后的程序代码编写时就可以直接使用这些工程模板,而不用再编写初始、启动等程序代码了,只需根据不同的要求编写“main.C”就行了,因而节省了大量时间,大大提高了工作效率。 这里主要说明“main.C”的编写,要实现的功能是使用硬件SPI接口输出0~F的数据,通过74HC595控制LED数码管显示0~F字符,同时控制4个LED显示对应的十六进制数。程序源代码如下: 4 仿 真 用ADS集成开发环境进行程序的编译连接设置,ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。ADS1.2支持ARM10以前的所有arm系列微控制器,支持软件调试,支持汇编、C和C++源程序,具有编译效率高、系统库功能强等特点。打开ADS1.2集成开发环境CodeWarrior IDE,使用事先加入的工程模板建立一个新的工程spi.mcp,把以上编好的代码文件main.c添加进工程。进行相关设置后,选择 Projeet→Make命令,编译并连接工程,生成spi.hex文件。 在原理图中双击微控制器LPC2106,出现一属性设置窗口Edit Component,如图2所示。在其中的ProgramFile中添加上面生成的spi.hex文件的路径,单击OK完成设置。 点击原理图左下角的运行按钮即开始仿真运行。数码管显示SPI发送的O~F的数据,LED显示的是相对应的十六进制值。仿真结果完全符合设计要求。 结 语 本文结合一个简单的SPI接口实验详细说明了ProteuS在ARM开发中的应用。可以看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。使用Proteus进行arm的虚拟开发,不仅可以减少实验硬件资本的投入,还突破了实际开发板中实验内容的局限性,使开发者能够充分发挥自身的主动性。使用Pro—teus仿真进行系统虚拟开发成功之后再进行实际制作,无疑可以提高开发效率、降低开发成本、提升开发速度,具有较高的推广应用价值。 以上便是小编此次带来的相关内容,希望大家喜欢。

    时间:2019-11-13 关键词: spi proteus 电路仿真软件

  • 带有杂散场补偿和SPI接口的3D位置霍尔传感器HAL® 3900

    带有杂散场补偿和SPI接口的3D位置霍尔传感器HAL® 3900

    2019年10月9日,TDK公司子公司Micronas以先前发布的masterHAL®家族和其新成员HAL® 39xy系列扩展了其霍尔位置传感器产品线。新的HAL 3900支持正真的3D磁场测量和2D杂散场补偿,可通过高速的SPI接口获得测量值。这使得该传感器完全满足当今以及今后汽车和工业市场的需求,并在单个产品中提供了四种不同的测量模式:线性位置测量、360° 角度测量、带渐变杂散场补偿的180° 角度测量以及真实三维磁场测量(BX, BY, BZ)。该器件样品已经可以提供,并将于2020年第二季度开始量产。 该HAL 3900传感器的核心在于专利注册的3D HAL® 测量单元。它不仅能精准的测量磁场,还能实现单点三个方向上的磁场测量。它能在测量BX, BY和BZ磁场时探测磁场的方向。同时其独有的霍尔板组阵列提供了杂散场补偿能力。这种高度灵活的组合方式使得工程师们能为各种给定的测量任务选择最好的测量模式。HAL 3900是市场上唯一能在单个器件中集成四种不同测量模式的产品。 SPI接口和3D测量功能的结合使HAL 3900成为变速杆或转向柱开关等应用的理想解决方案。其独特的杂散场补偿使该传感器完全适合需要杂散场稳定离轴测量的应用。 在强度为4000 A/m的杂散场的条件下,其可将由于杂散场引起的角度误差减小到0.3°以下。HAL 3900还具有睡眠模式,可帮助客户减少平均电流消耗,这对于电动汽车越来越重要。该产品的开发依据ISO 26262,符合ASIL B ready的SEooC(脱离上下文的安全元素)标准。 用语 ·3D HAL® 测量单元:可以直接测量X,Y,Z三个方向的磁场 ·正实的3D测量: 在三个方向X,Y,Z上并行测量磁场 ·杂散场补偿:新型的霍尔效应传感器必须对混合动力车或电动车(xEV)中的电机或者电路产生的干扰场不敏感。 主要应用 ·选择器和变速杆 ·变速箱中的位置检测 ·方向盘转向角检测 ·带有嵌入式微控制器的各种执行器 主要的特性及优点 ·BX,BY和BZ的真实3D磁场测量 ·SPI接口 ·睡眠模式以减少平均电流消耗 ·在BX, BY, BZ方向上对磁场原始测量值进行温度补偿,支持两个经计算的角度、角速度、磁场振幅和芯片温度 ·符合ISO 11452-8要求的杂散场稳定位置检测(线性和最大360°旋转) ·为180°以内旋转的应用提供渐变杂散场补偿 ·ISO 26262和规的SEooC,支持功能安全应用 ·适于汽车应用:温度范围从-40°C 到最高160°C 关键数据

    时间:2019-10-09 关键词: 霍尔传感器 spi 3d

  • Saki在PCI、iNet和Prosem展位上演示了Productronica India的二维和三维AOI和三维SPI系统

    Saki在PCI、iNet和Prosem展位上演示了Productronica India的二维和三维AOI和三维SPI系统

      Saki公司是自动化光学和X射线检测和测量设备领域的创新者,将于2019年在印度Productronica展示其二维和三维自动化光学检测(AOI)和三维锡膏检测(SPI)系统。Productronica India将于9月25日至27日在印度德里诺伊达的印度博览中心举行。Saki技术专家将在以下展位提供服务:PCI展位PA11、iNet展位PC11和Prosem展位PE45。    Saki亚太私人有限公司(新加坡)总经理Jayson Moy说:“印度是一个充满活力的电子产品开发和生产市场,强调质量控制,因此检测和测量系统是其电子组装过程的关键部分。”saki为印度的电子公司提供了一套完整的自动化检测系统,它们工作在一个通用的平台和软件上,便于设置和操作。这些产品符合最高标准,以确保准确可靠的检查、测量和M2M通信。” Saki的3D AOI和SPI系统是世界上速度最快、精度最高的3D检测和测量系统之一。它们提供了三种分辨率的选择——7μm、12μm和18μm——在单车道和双车道上都有平台,可处理宽度高达870mm的电路板,并以1μm分辨率检查和测量高度高达25 mm的组件,实际上消除了逃逸和假呼叫。光学头和6级环形照明为所有类型的组件提供无缝照明,侧摄像头提供多个视角,圆形照明在整个视野中提供一致的照明。该系统捕捉非常清晰、详细的图像,没有阴影,可用于检查最具挑战性的缺陷,如非湿润焊料、提升的引线、墓碑、背面和高度变化。  关于Saki公司  自1994年成立以来,Saki在通过机器人视觉技术开发自动识别方面一直处于领先地位。Saki的3D自动锡膏、光学和X射线检测系统(SPI、AOI、Axi)被公认为提供了真正M2M通信所需的稳定平台和先进的数据采集机制,提高了生产、工艺效率和产品质量。Saki公司总部位于日本东京,在世界各地设有办事处、销售和支持中心。

    时间:2019-09-27 关键词: spi aoi saki

  • Saki在PCI、iNet和Prosem展位上演示了Productronica India的二维和三维AOI和三维SPI系统

    Saki在PCI、iNet和Prosem展位上演示了Productronica India的二维和三维AOI和三维SPI系统

      Saki公司是自动化光学和X射线检测和测量设备领域的创新者,将于2019年在印度Productronica展示其二维和三维自动化光学检测(AOI)和三维锡膏检测(SPI)系统。Productronica India将于9月25日至27日在印度德里诺伊达的印度博览中心举行。Saki技术专家将在以下展位提供服务:PCI展位PA11、iNet展位PC11和Prosem展位PE45。        Saki亚太私人有限公司(新加坡)总经理Jayson Moy说:“印度是一个充满活力的电子产品开发和生产市场,强调质量控制,因此检测和测量系统是其电子组装过程的关键部分。”saki为印度的电子公司提供了一套完整的自动化检测系统,它们工作在一个通用的平台和软件上,便于设置和操作。这些产品符合最高标准,以确保准确可靠的检查、测量和M2M通信。” Saki的3D AOI和SPI系统是世界上速度最快、精度最高的3D检测和测量系统之一。它们提供了三种分辨率的选择——7μm、12μm和18μm——在单车道和双车道上都有平台,可处理宽度高达870mm的电路板,并以1μm分辨率检查和测量高度高达25 mm的组件,实际上消除了逃逸和假呼叫。光学头和6级环形照明为所有类型的组件提供无缝照明,侧摄像头提供多个视角,圆形照明在整个视野中提供一致的照明。该系统捕捉非常清晰、详细的图像,没有阴影,可用于检查最具挑战性的缺陷,如非湿润焊料、提升的引线、墓碑、背面和高度变化。 关于Saki公司        自1994年成立以来,Saki在通过机器人视觉技术开发自动识别方面一直处于领先地位。Saki的3D自动锡膏、光学和X射线检测系统(SPI、AOI、Axi)被公认为提供了真正M2M通信所需的稳定平台和先进的数据采集机制,提高了生产、工艺效率和产品质量。Saki公司总部位于日本东京,在世界各地设有办事处、销售和支持中心。

    时间:2019-09-27 关键词: spi aoi saki

  • 电路仿真软件详谈(六),Proteus电路仿真软件的超级应用

    电路仿真软件详谈(六),Proteus电路仿真软件的超级应用

    一款优秀的电路仿真软件,可帮助用户更好实现相应功能,而Proteus电路仿真软件便是这样一款利器。本文中,将讲解基于Proteus电路仿真软件的SPI接口的设计与实现。通过本文,希望大家对Proteus电路仿真软件的应用具备深层次的理解。   1、Proteus简介 Proteus软件是英国Labcenter electronics公司的EDA工具软件,是一个电子设计的教学平台、实验平台和创新平台,涵盖了电工电子实验室、电子技术实验室、单片机应用实验室等的全部功能。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的特点是: ①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 ②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及Phil-lips公司的arm(LPC系列)等。 ③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil、ADS等软件。 ④具有强大的原理图绘制功能。能够进行SCH(原理图)和PCB(印刷板)电路的设计。   2、Proteus环境下的原理图设计 Proteus和Protel、EWB等软件相似,绘制原理图都要先从器件库里取出所需的元器件符号并在绘图区布局好,同时编辑好元件的参数,接着进行连线,添加必要的网络标号等步骤。下面通过一个简单的实例说明如何使用Proteus软件实现arm(以LPC2106为例)系统的设计与仿真。实例以 LPC2106控制器为核心,使用硬件SPI接口与74HC595进行连接,添加必要的外围电路,控制74HC595驱动LED数码管显示。电路原理如图 1所示。LPC2106的P0.4(/SCK/CAP0.1)、P0.6(/MOSI/CAP0.2)和P0.8(/TxD1/PWM4)分别与 74HC595的SH_CP、DS和ST_CP相连来控制74HC595,74HC595的输出Q0~Q6分别与数码管和LED相连,控制它们的实时显示。   3、程序代码的编写 程序代码的编写主要分4个部分进行: ①LPC2106的初始化代码; ②LPC2106异常向量入口及异常向量与C语言代码的接口,包括初始化堆栈的代码; ③LPC2106目标板特殊的代码,包括异常处理程序和目标板初始化程序; ④根据实例要求并结合原理图,编写实现预期功能的代码,即通常的执行代码,代码文件保存为“main.C”。 通常为了节省开发的时间,一般用设计好的工程模板,这里使用LPC2100系列工程模板。模板中包含LPC2100系列ARM7微控制器的启动文件,包括 STACK.S、HEAP.S、STARTUP.S和TARGET.C;模板还包含LPC2100系列arm7微控制器的头文件,分散加载描述文件(如 mem_a.scf、mem_b.scf和mem_c.scf)等等。这样在以后的程序代码编写时就可以直接使用这些工程模板,而不用再编写初始、启动等程序代码了,只需根据不同的要求编写“main.C”就行了,因而节省了大量时间,大大提高了工作效率。 这里主要说明“main.C”的编写,要实现的功能是使用硬件SPI接口输出0~F的数据,通过74HC595控制LED数码管显示0~F字符,同时控制4个LED显示对应的十六进制数。程序源代码如下:                                   4、仿真 用ADS集成开发环境进行程序的编译连接设置,ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。ADS1.2支持ARM10以前的所有arm系列微控制器,支持软件调试,支持汇编、C和C++源程序,具有编译效率高、系统库功能强等特点。打开ADS1.2集成开发环境CodeWarrior IDE,使用事先加入的工程模板建立一个新的工程spi.mcp,把以上编好的代码文件main.c添加进工程。进行相关设置后,选择 Projeet→Make命令,编译并连接工程,生成spi.hex文件。 在原理图中双击微控制器LPC2106,出现一属性设置窗口Edit Component,如图2所示。在其中的ProgramFile中添加上面生成的spi.hex文件的路径,单击OK完成设置。 点击原理图左下角的运行按钮即开始仿真运行。数码管显示SPI发送的O~F的数据,LED显示的是相对应的十六进制值。仿真结果完全符合设计要求。 本文结合一个简单的SPI接口实验详细说明了ProteuS在ARM开发中的应用。可以看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。使用Proteus进行arm的虚拟开发,不仅可以减少实验硬件资本的投入,还突破了实际开发板中实验内容的局限性,使开发者能够充分发挥自身的主动性。使用Pro—teus仿真进行系统虚拟开发成功之后再进行实际制作,无疑可以提高开发效率、降低开发成本、提升开发速度,具有较高的推广应用价值。 好了,以上便是小编此次带来的有关电路仿真软件的分享,希望大家喜欢此次小编带来的文章。

    时间:2019-09-04 关键词: spi proteus 电路仿真软件

  • 秒懂I2C串行总线的工作原理以及特点

    秒懂I2C串行总线的工作原理以及特点

    我们都知道I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 I2C总线简介 I2C结合了SPI和UART的优点。使用I2C,您可以将多个从设备连接到单个主设备上(如SPI),并且可以让多个主器件控制单个或多个从器件。当您希望有多个微控制器记录数据到单个存储卡或将文本显示到单个LCD时,这非常有用。 与UART通信一样,I2C仅使用两条线在设备之间传输数据:     SDA(串行数据) - 主站和从站发送和接收数据的线路。 SCL(串行时钟) - 承载时钟信号的线路。 I2C是一种串行通信协议,因此数据沿着单线(SDA线)逐位传输。 与SPI一样,I2C是同步的,因此位输出通过主机和从机之间共享的时钟信号与位采样同步。时钟信号始终由主机控制。     I2C如何工作 使用I2C时,数据被转换成messages,messages则被分解为数据帧。每条messages都有一个地址帧,其中包含从站的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的启动和停止条件,读/写位和ACK / NACK位:     启动条件:在SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。 停止条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。 地址帧:每个从站唯一的7或10位序列,用于在主站想与之通信时识别从站。 读/写位:单个位,指定主器件是向从器件发送数据(低电压电平)还是从器件请求数据(高电压电平)。 ACK / NACK位:消息中的每个帧后跟一个应答/不应答位。如果成功接收到地址帧或数据帧,则从接收设备向发送方返回ACK位。 地址 I2C没有像SPI这样的从选择线,因此它需要另一种方法让从器件知道数据正在发送给它,而不是另一个从器件。它通过地址来做到这一点。地址帧始终是新消息中起始位之后的第一帧。 主设备将与其通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,则将低电压ACK位发送回主机。如果地址不匹配,则从器件不执行任何操作,SDA线保持高电平。 读/写位 地址帧在末尾包括一个位,用于通知从设备,主设备是想要向其写入数据还是从主设备接收数据。如果主设备想要向从设备发送数据,则读/写位是低电平。如果主设备向从设备请求数据,则该位是高电平。 数据框架 在主设备检测到来自从设备的ACK位之后,准备好发送第一个数据帧。 数据帧始终为8位长,并以最高有效位先发送。紧接着每个数据帧的ACK / NACK位以验证帧已被成功接收。在发送下一个数据帧之前,主机或从机必须接收ACK位(取决于发送数据的人)。 在发送了所有数据帧之后,主设备可以向从设备发送停止条件以停止传输。停止条件是SCL线上从低电平到高电平转换后,SDA线上从低电平变为高电平,SCL线保持高电平。 I2C数据传输步骤 1.主机向每一个连接的从设备发送数据,然后将SDA信号从高切换到低,之后在将SCL从高切换到低电平。     2.主设备向每个从设备发送它想要与之通信的从设备的7或10位地址,以及读/写位:     3.每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从器件通过将SDA线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线保持为高电平。     4.主设备发送或接收数据帧:     5.在传输了每个数据帧之后,接收设备将另一个ACK位返回给发送方以确认成功接收到该帧:     6.要停止数据传输,主机通过在将SDA切换为高电平之前切换SCL为高电平来向从机发送停止条件:     有多个从设备的单一主设备 由于I2C使用寻址,因此可以从单个主设备控制多个从设备。使用7位地址,可以使用128(27)个唯一地址。使用10位地址并不常见,但提供1,024(210)个唯一地址。要将多个从器件连接到单个主器件,请像这样连接它们,使用4.7K欧姆上拉电阻将SDA和SCL线连接到Vcc:     有多个从设备及多个主设备 多个主设备可以连接到单个从设备或多个从设备。当两个主设备尝试通过SDA线同时发送或接收数据时,同一系统中出现多个主设备的问题。为了解决这个问题,每个主设备需要在发送消息之前检测SDA线路是低还是高。如果SDA线为低电平,则表示另一个主控制器已控制总线,主控制器应等待发送消息。如果SDA线路很高,那么传输信息是安全的。要将多个主设备连接到多个从设备,请使用下图,使用4.7K欧姆上拉电阻将SDA和SCL线路连接到Vcc:     I2C的优点和缺点 与其他协议相比,I2C听起来很复杂,不容易在程序中实现而导致数据丢失、无应答、“死等”等问题。但却有很多优点: 优点 只使用两根电线 支持多个主服务器和多个从服务器 ACK / NACK位确认每个帧都已成功传输 硬件没有UART那么复杂 众所周知且广泛使用的协议 缺点 数据传输速率比SPI慢 数据帧的大小限制为8位 实现比SPI更复杂的硬件

    时间:2019-08-23 关键词: uart i2c spi 总线与接口

  • 51单片机——SPI

    UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。 1、初步介绍 SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。 SPI 通信原理比 I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的 SPI 是 4 根线,分别是 SSEL( 片选,也写作 SCS)、 SCLK( 时钟,也写作 SCK)、 MOSI( 主机输出从机输入Master Output/Slave Input) 和 MISO( 主机输入从机输出 Master Input/Slave Output)。 SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。 SCLK:时钟信号,由主机产生,和 I2C通信的 SCL 有点类似。 MOSI:主机给从机发送指令或者数据的通道。 MISO:主机读取从机的状态或者数据的通道。 2、工作模式 SPI 通信的主机也是我们的单片机,在读写数据时序的过程中,有四种模式; CPOL:Clock Polarity,就是时钟的极性。通信的整个过程分为空闲时刻和通信时刻, 如果 SCLK 在数据发送之前和之后的空闲状态是高电平, 那么就是CPOL=1,如果空闲状态SCLK 是低电平,那么就是 CPOL=0。 CPHA: Clock Phase,就是时钟的相位。 #include typedef unsigned char uchar; sbit DS1302_CE = P1 ^ 7; sbit DS1302_CK = P3 ^ 5; sbit DS1302_IO = P3 ^ 4; struct sTime //日期时间结构体定义 { unsigned int year; //年 unsigned char mon; //月 unsigned char day; //日 unsigned char hour; //时 unsigned char min; //分 unsigned char sec; //秒 unsigned char week; //星期 }; /* 发送一个字节到DS1302通信总线上*/ void DS1302ByteWrite(uchar dat) { uchar mask; for (mask = 0x01; mask != 0; mask <<= 1) //低位在前,逐位移出 { if ((mask & dat) != 0) //首先输出该位数据 { DS1302_IO = 1; } else { DS1302_IO = 0; } DS1302_CK = 1; //然后拉高时钟 DS1302_CK = 0; //再拉低时钟,完成一个位的操作 } DS1302_IO = 1; //最后确保释放IO引脚 } /* 由DS1302通信总线上读取一个字节*/ uchar DS1302ByteRead() { uchar mask; uchar dat = 0; for (mask = 0x01; mask != 0; mask <<= 1) //低位在前,逐位读取 { if (DS1302_IO != 0) //首先读取此时的IO引脚,并设置dat中的对应位 { dat |= mask; } DS1302_CK = 1; //然后拉高时钟 DS1302_CK = 0; //再拉低时钟,完成一个位的操作 } return dat; //最后返回读到的字节数据 } /* 用单次写操作向某一寄存器写入一个字节,reg-寄存器地址,dat-待写入字节*/ void DS1302SingleWrite(uchar reg, uchar dat) { DS1302_CE = 1; //使能片选信号 DS1302ByteWrite((reg << 1) | 0x80); //发送写寄存器指令 DS1302ByteWrite(dat); //写入字节数据 DS1302_CE = 0; //除能片选信号 } /* 用单次读操作从某一寄存器读取一个字节,reg-寄存器地址,返回值-读到的字节*/ uchar DS1302SingleRead(uchar reg) { uchar dat; DS1302_CE = 1; //使能片选信号 DS1302ByteWrite((reg << 1) | 0x81); //发送读寄存器指令 dat = DS1302ByteRead(); //读取字节数据 DS1302_CE = 0; //除能片选信号 return dat; } /* 用突发模式连续写入8个寄存器数据,dat-待写入数据指针*/ void DS1302BurstWrite(uchar *dat) { uchar i; DS1302_CE = 1; DS1302ByteWrite(0xBE); //发送突发写寄存器指令 for (i = 0; i < 8; i++) //连续写入8字节数据 { DS1302ByteWrite(dat[i]); } DS1302_CE = 0; } /* 用突发模式连续读取8个寄存器的数据,dat-读取数据的接收指针*/ void DS1302BurstRead(uchar *dat) { uchar i; DS1302_CE = 1; DS1302ByteWrite(0xBF); //发送突发读寄存器指令 for (i = 0; i < 8; i++) //连续读取8个字节 { dat[i] = DS1302ByteRead(); } DS1302_CE = 0; } /* 获取实时时间,即读取DS1302当前时间并转换为时间结构体格式*/ void GetRealTime(struct sTime *time) { uchar buf[8]; DS1302BurstRead(buf); time->year = buf[6] + 0x2000; time->mon = buf[4]; time->day = buf[3]; time->hour = buf[2]; time->min = buf[1]; time->sec = buf[0]; time->week = buf[5]; } /* 设定实时时间,时间结构体格式的设定时间转换为数组并写入DS1302*/ void SetRealTime(struct sTime *time) { uchar buf[8]; buf[7] = 0; buf[6] = time->year; buf[5] = time->week; buf[4] = time->mon; buf[3] = time->day; buf[2] = time->hour; buf[1] = time->min; buf[0] = time->sec; DS1302BurstWrite(buf); } /* DS1302初始化,如发生掉电则重新设置初始时间*/ void InitDS1302() { uchar dat; struct sTime code InitTime[] = //2016年5月18日9:00:00 星期二 { 0x2016, 0x05, 0x18, 0x09, 0x00, 0x00, 0x02 }; DS1302_CE = 0; //初始化DS1302通信引脚 DS1302_CK = 0; dat = DS1302SingleRead(0); //读取秒寄存器 if ((dat & 0x80) != 0) //由秒寄存器最高位CH的值判断DS1302是否已停止 { DS1302SingleWrite(7, 0x00); //撤销写保护以允许写入数据 SetRealTime(&InitTime); //设置DS1302为默认的初始时间 } }

    时间:2019-07-15 关键词: 51单片机 spi

  • SPI接口简介

    SPI接口简介

    串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以及它们如何帮助减少系统电路板设计中的数字GPIO数量。SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。SPI接口可以是3线式或4线式。本文重点介绍常用的4线SPI接口。接口图1.含主机和从机的SPI配置4线SPI器件有四个信号:► 时钟(SPI CLK,SCLK)► 片选(CS)► 主机输出、从机输入(MOSI)► 主机输入、从机输出(MISO)产生时钟信号的器件称为主机。主机和从机之间传输的数据与主机产生的时钟同步。同I2C接口相比,SPI器件支持更高的时钟频率。用户应查阅产品数据手册以了解SPI接口的时钟频率规格。SPI接口只能有一个主机,但可以有一个或多个从机。图1显示了主机和从机之间的SPI连接。来自主机的片选信号用于选择从机。这通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。本文中的片选信号始终是低电平有效信号。MOSI和MISO是数据线。MOSI将数据从主机发送到从机,MISO将数据从从机发送到主机。数据传输要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。欲确定使用SPI接口传输的数据位数,请参阅器件数据手册。时钟极性和时钟相位在SPI中,主机可以选择时钟极性和时钟相位。在空闲状态期间,CPOL位设置时钟信号的极性。空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间。CPHA位选择时钟相位。根据CPHA位的状态,使用时钟上升沿或下降沿来采样和/或移位数据。主机必须根据从机的要求选择时钟极性和时钟相位。根据CPOL和CPHA位的选择,有四种SPI模式可用。表1显示了这4种SPI模式。表1.通过CPOL和CPHA选择SPI模式图2至图5显示了四种SPI模式下的通信示例。在这些示例中,数据显示在MOSI和MISO线上。传输的开始和结束用绿色虚线表示,采样边沿用橙色虚线表示,移位边沿用蓝色虚线表示。请注意,这些图形仅供参考。要成功进行SPI通信,用户须参阅产品数据手册并确保满足器件的时序规格。图2.SPI模式0,CPOL=0,CPHA=0:CLK空闲状态=低电平,数据在上升沿采样,并在下降沿移出图3.SPI模式1,CPOL=0,CPHA=1:CLK空闲状态=低电平,数据在下降沿采样,并在上升沿移出图4.SPI模式2,CPOL=1,CPHA=1:CLK空闲状态=高电平,数据在下降沿采样,并在上升沿移出图5.SPI模式3,CPOL=1,CPHA=0:CLK空闲状态=高电平,数据在上升沿采样,并在下降沿移出图3给出了SPI模式1的时序图。在此模式下,时钟极性为0,表示时钟信号的空闲状态为低电平。此模式下的时钟相位为1,表示数据在下降沿采样(由橙色虚线显示),并且数据在时钟信号的上升沿移出(由蓝色虚线显示)。图4给出了SPI模式2的时序图。在此模式下,时钟极性为1,表示时钟信号的空闲状态为高电平。此模式下的时钟相位为1,表示数据在下降沿采样(由橙色虚线显示),并且数据在时钟信号的上升沿移出(由蓝色虚线显示)。图5给出了SPI模式3的时序图。在此模式下,时钟极性为1,表示时钟信号的空闲状态为高电平。此模式下的时钟相位为0,表示数据在上升沿采样(由橙色虚线显示),并且数据在时钟信号的下降沿移出(由蓝色虚线显示)。多从机配置多个从机可与单个SPI主机一起使用。从机可以采用常规模式连接,或采用菊花链模式连接。图6.多从机SPI配置常规SPI模式:在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。从图6可以看出,随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号。菊花链模式:图7.多从机SPI菊花链配置在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。例如在图7所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需8个时钟脉冲。图8显示了时钟周期和通过菊花链的数据传播。并非所有SPI器件都支持菊花链模式。请参阅产品数据手册以确认菊花链是否可用。图8.菊花链配置:数据传播ADI公司支持SPI的模拟开关与多路转换器ADI公司最新一代支持SPI的开关可在不影响精密开关性能的情况下显著节省空间。本文的这一部分将讨论一个案例研究,说明支持SPI的开关或多路复用器如何能够大大简化系统级设计并减少所需的GPIO数量。ADG1412是一款四通道、单刀单掷(SPST)开关,需要四个GPIO连接到每个开关的控制输入。图9显示了微控制器和一个ADG1412之间的连接。图9.微控制器GPIO用作开关的控制信号随着电路板上开关数量的增加,所需GPIO的数量也会显著增加。例如,当设计一个测试仪器系统时,会使用大量开关来增加系统中的通道数。在4×4交叉点矩阵配置中,使用四个ADG1412。此系统需要16个GPIO,限制了标准微控制器中的可用GPIO。图10显示了使用微控制器的16个GPIO连接四个ADG1412。为了减少GPIO数量,一种方法是使用串行转并行转换器,如图11所示。该器件输出的并行信号可连接到开关控制输入,器件可通过串行接口SPI配置。此方法的缺点是外加器件会导致物料清单增加。另一种方法是使用SPI控制的开关。此方法的优点是可减少所需GPIO的数量,并且还能消除外加串行转并行转换器的开销。如图12所示,不需要16个微控制器GPIO,只需要7个微控制器GPIO就可以向4个ADGS1412提供SPI信号。开关可采用菊花链配置,以进一步优化GPIO数量。在菊花链配置中,无论系统使用多少开关,都只使用主机(微控制器)的四个GPIO。图10.在多从机配置中,所需GPIO的数量大幅增加图11.使用串行转并行转换器的多从机开关图12.支持SPI的开关节省微控制器GPIO图13.菊花链配置的SPI开关可进一步优化GPIO图13用于说明目的。ADGS1412数据手册建议在SDO引脚上使用一个上拉电阻。有关菊花链模式的更多信息,请参阅ADGS1412数据手册。为简单起见,此示例使用了四个开关。随着系统中开关数量的增加,电路板简单和节省空间的优点很重要。在6层电路板上放置8个四通道SPST开关,采用4×8交叉点配置时,ADI公司支持SPI的开关可节省20%的总电路板空间。文章“精密SPI开关配置提高通道密度”详细说明了精密SPI开关配置如何提高通道密度。

    时间:2019-07-15 关键词: spi gpio 串行外设接口

  • SPI_FLASH高速读写

    #include  "KH25L6406.h"#define    SPI_WAIT()     while(FLASH_SPI->SR & BSY)/*********************************************************************************************************** Function name:       Send_Byte** Descriptions:        通过硬件SPI发送一个字节到串行Flash器件** input parameters:    data:  发送的数据** output parameters:   NONE** Returned value:      NONE*********************************************************************************************************/static void Send_Byte(unsigned char ucdata){//   SSIDataPut(SSI0_BASE, ucdata);    SPI_WAIT();    FLASH_SPI->DR = ucdata;}/*********************************************************************************************************** Function name:       Get_Byte** Descriptions:        通过硬件SPI接口接收一个字节到处理器** input parameters:    NONE** output parameters:   NONE** Returned value:      ReadData  读回的数据*********************************************************************************************************/static unsigned char Get_Byte(void){   uint16_t ulReadData;//   SSIDataPut(SSI0_BASE, 0xFF);                         //  发送一个无效字节,以产生接收时钟//   SSIDataGet(SSI0_BASE, &ulReadData);    SPI_WAIT();    FLASH_SPI->DR = 0xFF;    SPI_WAIT();    while (FLASH_SPI->SR & RNE)    ulReadData = FLASH_SPI->DR;    return ((unsigned char)ulReadData);}/*********************************************************************************************************** Function name:       SPIFIFOClear** Descriptions:        SPI 清空FIFO** input parameters:    NONE** Returned value:      NONE*********************************************************************************************************/static void SPIFIFOClear(void){    uint16_t ulRecBuf = 0;    SPI_WAIT();    while (FLASH_SPI->SR & RNE)    {      ulRecBuf = FLASH_SPI->DR;    }                                                   /* 清空FIFO                     */    }/*********************************************************************************************************** Function name:       FLASH_GPIO_Init** Descriptions:        GPIO口初始化** input parameters:    NONE** output parameters:   NONE** Returned value:      NONE*********************************************************************************************************/static void FLASH_KH25L6406E_GPIO_Init(void){    SPI_CS_FLASH_GPIO ->FIODIR |= _BV(SPI_CS_FLASH_PIN);}/*********************************************************************************************************** Function name:       serialFlashInit** Descriptions:        初始化控制串行Flash的SSI管脚** input parameters:    tAnyDevice:  串行Flash特性描述的结构体指针** output parameters:   NONE** Returned value:      NONE*********************************************************************************************************/void  serialFlashInit ( void){    FLASH_KH25L6406E_GPIO_Init();    CE_Low();    SPIFIFOClear();    CE_High();}/*********************************************************************************************************** Function name:       serialFlash_RdID** Descriptions:        读取串行Flash完整的ID** input parameters:    tAnyDevice: 串行Flash特性描述的结构体指针**                      ulReadID:   存储ID变量的指针** output parameters:   NONE** Returned value:      操作成功则返回FLASH_OK,失败则返回FLASH_ERROR** 注   意:             若填入的参数不符合要求,则返回FLASH_ERROR*********************************************************************************************************/static uint32 serialFlash_RdID ( void){    uint32 ultemp = 0;    CE_Low();    Send_Byte(  ucReadJEDEC_ID);    SPIFIFOClear();    ultemp = (ultemp | Get_Byte()) << 8;                        // 接收数据    ultemp = (ultemp | Get_Byte()) << 8;    ultemp = (ultemp | Get_Byte());    SPI_WAIT();    CE_High();    return ultemp;}/*********************************************************************************************************** Function name:       serialFlash_SelfTest** Descriptions:        串行Flash自检程序** input parameters:    NONE** output parameters:   FLASH_OK    : SPI_FLASH正常**                      FLASH_ERROR : SPI_FLASH器件错误** Returned value:      操作成功则返回FLASH_OK,失败则返回FLASH_ERROR** 注   意:             若填入的参数不符合要求,则返回FLASH_ERROR*********************************************************************************************************/uint8 serialFlash_SelfTest( void){    if(serialFlash_RdID() == ulID)    {        return FLASH_OK;    }        return FLASH_ERROR;    }/*********************************************************************************************************** Function name:       serialFlash_RD** Descriptions:        从串行Flash的指定起始地址读取指定字节的数据** input parameters:    tAnyDevice: 串行Flash特性描述的结构体指针**                      ulDstAddr:  指定读取数据的起始地址,范围要根据具体的器件而定**                      pucRcvBuf: 读取数据存放的缓冲区指针**                      ulNByte: 指定读取数据的大小,以字节为单位。为0,表示不读出任何数据。** output parameters:   NONE** Returned value:      实际取出的字节数。一般情况下,应该等于ulNByte。如果小于ulNByte,则表示读取数据**                      已经达到最大地址处。*********************************************************************************************************/unsigned long serialFlash_RD ( unsigned long ulDstAddr,                             unsigned char* pucRcvBuf, unsigned long ulNByte){    unsigned long i = 0;    if((ulNByte == 0) || (ulDstAddr > (  ulMaxAddr)))         return (0);                                                     //  检查入口参数        if ((ulDstAddr + ulNByte - 1) > (  ulMaxAddr))        ulNByte = (  ulMaxAddr) - ulDstAddr + 1;     CE_Low();     Send_Byte(  ucRead);                     // 发送读命令     Send_Byte(((ulDstAddr & 0xFFFFFF) >> 16));                         // 发送地址信息:该地址由3个字节组成     Send_Byte(((ulDstAddr & 0xFFFF) >> 8));     Send_Byte(ulDstAddr & 0xFF);     if(  ucIsReadWait != 0)        Send_Byte(0xFF);     SPIFIFOClear();     for (i = 0; i < ulNByte; i++)     {         pucRcvBuf[i] = Get_Byte();     }     SPI_WAIT();     CE_High();    return (ulNByte);}/*********************************************************************************************************** Function name:       serialFlash_WR** Descriptions:        向串行Flash指定地址写入指定字节的数据** input parameters:    tAnyDevice: 串行Flash特性描述的结构体**                      ulDstAddr:  指定读取数据的起始地址,范围要根据具体的器件而定**                      pucSndBuf:  发送缓冲区的指针**                      ulNByte:    发送数据的大小,以字节为单位。为0,表示不编程任何数据。** output parameters:   NONE** Returned value:      实际取出的字节数。一般情况下,应该等于ulNByte。如果小于ulNByte,则表示读取数据**                      已经达到最大地址处。*********************************************************************************************************/unsigned char serialFlash_PageProgram ( unsigned long ulDstAddr,                               unsigned char* pucSndBuf,uint16 ulNByte){    unsigned char ucTemp = 0, ucStatus = 0;    uint16 i;    uint8 ulReturn = 0;    //    if((ulNByte == 0) || (ulDstAddr > ulMaxAddr) || (ulNByte > 0x100))//    {//        return 0;//    }//    ulNByte = (ulDstAddr/0x100 + ulNByte)/0x100;//    if((ulDstAddr/0x100 + ulNByte) > 0x100)//    {//        ulNByte = 0x100 - ulDstAddr/0x100 + 1;//        ulReturn = ulNByte;//    }        do {        CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    }while(ucTemp & 0x01);             do {            CE_Low();        Send_Byte( ucEnWrite);       // 发送写使能命令        SPI_WAIT();        CE_High();                CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    } while(!(ucTemp & 0x02));        CE_Low();    Send_Byte(ucWrite);     // 发送字节数据烧写命令    Send_Byte(((ulDstAddr & 0xFFFFFF) >> 16));    // 发送3个字节的地址信息    Send_Byte(((ulDstAddr & 0xFFFF) >> 8));    Send_Byte(ulDstAddr & 0xFF);    for (i = 0; i <= ulNByte; i ++)    {        Send_Byte(*pucSndBuf++);                    // 发送被烧写的数据    }    CE_High();    DelayUS(100);    do {        CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    }while(ucTemp & 0x01);              CE_Low();    Send_Byte( ucDisWrite);       // 发送写使能命令    SPI_WAIT();    CE_High();    return ulReturn;}/*********************************************************************************************************** Function name:           serialFlash_SecErase** Descriptions:            对串行Flash的指定的扇区进行擦除操作** input parameters:        tAnyDevice: 串行Flash特性描述的结构体**                          ulSecNo: 指定需要擦除的扇区,0代表第0扇区** output parameters:       NONE** Returned value:          操作成功则返回FLASH_OK,失败则返回FLASH_ERROR*********************************************************************************************************/unsigned char serialFlash_SecErase( unsigned long ulSecNo){    unsigned char ucTemp= 0, ucStatus = 0;    unsigned long ulAddr = 0;        if(ulSecNo > (  ulSecMax))        return (FLASH_ERROR);    ulAddr = (  ulSecSize) * ulSecNo;// 计算扇区的起始地址    do {        CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    }while(ucTemp & 0x01);             do {            CE_Low();        Send_Byte( ucEnWrite);       // 发送写使能命令        SPI_WAIT();        CE_High();                CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    } while(!(ucTemp & 0x02));        CE_Low();    Send_Byte(  ucSecErase);      // 发送扇区擦除指令    Send_Byte(((ulAddr & 0xFFFFFF) >> 16));                 // 发送3个字节的地址信息    Send_Byte(((ulAddr & 0xFFFF) >> 8));    Send_Byte(ulAddr & 0xFF);    SPI_WAIT();    CE_High();        do {        CE_Low();        Send_Byte( ucReadStatus);  // 发送读状态寄存器命令        SPIFIFOClear();        ucTemp = Get_Byte();        // 保存读得的状态寄存器值        SPI_WAIT();        CE_High();    }while(ucTemp & 0x01);              CE_Low();    Send_Byte( ucDisWrite);       // 发送写使能命令    SPI_WAIT();    CE_High();        return (FLASH_OK);}/********************************************************************************************************      END FILE********************************************************************************************************/

    时间:2019-06-14 关键词: Flash spi

  • 网络编程之Winsock2 服务提供者接口(SPI)

    网络编程之Winsock2 服务提供者接口(SPI)

    【1】Winsock2 服务提供者接口(SPI):一、简述:1、一般用于提供给操作系统开发商、传输堆栈商在基础协议的基础上,开发更高级的服务.2、因为Winsock服务体系符合Windows开放服务体系.所以,它支持第三方服务提供者插入到其中.3、只要上层和下层的边缘支持Winsock2 SPI,即可向他们中间安装第三方提供者程序.4、普通开发者一般都是开发SPI的LSP(分层服务提供者),即第三方提供者,可用于监控Winsock API执行,HOOK Winsock API,甚至利用LSP技术注入DLL.5、基础协议(TCP、UDP、原始)的提供者其实就是DLL,编写分层协议提供者就是在编写DLL,然后安装在Winsock目录上,让系统上的所有使用基础协议的网络程序调用.【重点】网络程序是如何调用Winsock2 服务提供者进行网络通讯:1、当网络程序使用WSAStartup加载库时,系统并不做什么.2、而是当程序真正创建套接字时,会先调用WSCEnumProtocols函数,遍历系统内安装的所有提供者(分层、基础、协议链),当先找到一个与要求使用的协议符合的,那么导出此提供者的DLL,才开始调用提供者的WSPStartup初始化函数,才能使用send,recv(TCP协议提供者的DLL)或sendto,recvfrom(UDP协议提供者的DLL)等函数的功能.二、SPI(服务提供者接口)由两个部分组成:  一、传输服务提供者:1、提供建立连接、传输数据、流控制、出错控制。2、共两种类型:基础服务提供者:实现传输协议的细节,导出Winsock接口(此接口直接实现协议). //TCP、UDP、原始一般都有与之关联的内核模式协议驱动,TCP、UDP由系统内的Tcpip.sys驱动。分层服务提供者(LSP):将自己安装到Winsock目录(Winsock目录的概念在下面)中基础提供者(TCP/UDP)的上一层,也可能安装在其他提供者之间,可截获程序的Winsock API。依靠基础服务提供者作为通信基础,实现更高层的通信函数。二、命名空间服务提供者:1、与传输服务提供者相似,可截获名称解析API(gethostbyname、WSALookupServiceBegin)的调用.2、此类提供者需在命名空间目录安装自己.【2】SPI(服务提供者)函数集合类型:      头文件:ws2spi.hSPI函数类型总数:4种类型,每一种类型都有自己所属的开头,例如WSC、WSPWSC 安装、移除、修改分层服务提供者和命名空间提供者程序 WSP 分层服务提供者的API WPU 分层服务提供者使用的支持函数 NSP 命名空间服务提供者的API【3】Winsock协议目录的概念:一、SPI提供三种协议:1、分层协议:处在基础协议的上一层,依靠基础协议作为通信基础。2、基础协议:能够独立、安全、远程端点实现数据通信的协议。3、协议链:将一系列基础协议和分层协议按特定顺序连接在一起。注意:只有管理员用户组能够安装、移除Winsock目录入口!二、WSAPROTOCOL_INFO结构体:说明:描述某个协议(分层协议、基础协议)的完整信息,一个WSAPROTOCOL_INFO结构体称为一个Winsock目录入口。typedef struct _WSAPROTOCOL_INFOW {     DWORD dwServiceFlags1;       //描述[协议]提供的服务的位掩码     DWORD dwServiceFlags2;       //保留     DWORD dwServiceFlags3;       //保留     DWORD dwServiceFlags4;       //保留     DWORD dwProviderFlags;       //此[协议]在[Winsock目录]中的[表示方式]     GUID ProviderId;                      //由[服务提供商]安排的GUID唯一标示符     DWORD dwCatalogEntryId;      //WS2_32.DLL为每一个WSAPROTOCOL_INFOW结构安排的唯一标示符(目录入口ID)     WSAPROTOCOLCHAIN ProtocolChain; /*1)与[此协议]相关联的WSAPROTOCOLCHAIN结构.                                                                      2)说明了[此协议]在[分层协议]中所处的位置.*/     int iVersion;                       //[协议]版本标示符     int iAddressFamily;            //传递给socket/WSASocket函数的[地址加载参数]        int iMaxSockAddr;              //地址的最大长度(以字节为单位)     int iMinSockAddr;               //地址的最小长度(以字节为单位)     int iSocketType;                 //传递给socket函数的[套接字类型参数]     int iProtocol;                       //传递给socket函数的[协议参数]     int iProtocolMaxOffset;       //添加到iProtocol的最大值     int iNetworkByteOrder;       //顺序类型:大尾顺序(BIGENDIAN),小尾顺序(LITTLEENDIAN)     int iSecurityScheme;          //安全方案     DWORD dwMessageSize;         /*[此协议]支持的最大消息长度(以字节为单位)                                    1)0为基于流协议(如TCP),没有最大长度的概念.                                    2)1为发送消息的最大长度依赖于下层网络的MTU(最大传输单元),在套接字绑定后,应使用SO_MAX_MSG_SIZE套接字选项.                                      获取发送消息的最大长度.                                    3)-1为此协议是基于消息的,但是对发送的消息没有最大长度的限制.                                  */       DWORD dwProviderReserved;                            //保留给服务提供者使用.     WCHAR  szProtocol[WSAPROTOCOL_LEN+1];  //随意编辑的,此协议的可读字符串.一般用于说明是什么协议 } WSAPROTOCOL_INFOW, FAR * LPWSAPROTOCOL_INFOW;【4】遍历系统所有已安装的协议:一、使用的API函数:int WSAEnumProtocols(  LPINT                                 lpiProtocols,       LPWSAPROTOCOL_INFO lpProtocolBuffer,    LPDWORD                          lpdwBufferLength);返回值:系统中安装的协议数量,失败为SOCKET_ERROR.参数1:一个数组1、NULL为函数将返回所有协议.2、否则只检索数组中列出的那些协议.参数2:取信息的缓冲区参数3:参数2缓冲区的长度1、如果参数2为NULL,参数3为0,执行后,WSAENOBUFS错误,参数3包含了所需的缓冲区长度.注意:此函数仅能够遍历基础协议、协议链,但是不能遍历分层协议.二、支持遍历分层协议的函数,功能与上面相同:函数:intWSCEnumProtocols(  LPINT lpiProtocols,  LPWSAPROTOCOL_INFOW lpProtocolBuffer,  LPDWORD lpdwBufferLength,  LPINT lpErrno );返回值、参数1~参数3:与WSAEnumProtocols函数相同。参数4:相当于WSAGetLastError()执行的结果注意:因为SPI是用于开发系统组件的函数,所以他只使用Unicode字符串,与Windows系统相对应。【5】遍历系统内安装的所有协议例子:头文件:#pragma once #include#include#include#include#include#includeusing namespace std; #pragma warning(disable:4996) #pragma comment(lib, "Ws2_32.lib") //系统安装协议遍历实验 class ProtocolTraversestheExperiment { public: ProtocolTraversestheExperiment() { WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); } ~ProtocolTraversestheExperiment() { WSACleanup(); } LPWSAPROTOCOL_INFO GetProvider(LPINT lpnTotalProtocols) { DWORD dwSize = 0; LPWSAPROTOCOL_INFO pProtoInfo = NULL; if (WSAEnumProtocols(NULL, pProtoInfo, &dwSize) == SOCKET_ERROR) { if (WSAGetLastError() != WSAENOBUFS) return NULL; } pProtoInfo = (LPWSAPROTOCOL_INFO)new WSAPROTOCOL_INFO[dwSize / sizeof(WSAPROTOCOL_INFO)]; if (!pProtoInfo) return NULL; ZeroMemory(pProtoInfo, dwSize); *lpnTotalProtocols = WSAEnumProtocols(NULL, pProtoInfo, &dwSize); return pProtoInfo; } void FreeProvider(LPWSAPROTOCOL_INFO pProtoInfo,int i) { if(i == 1) delete pProtoInfo; else    delete[] pProtoInfo; } };源文件:#include "Hello.h" int main(int argc,char** argv) { system("color 4e"); ProtocolTraversestheExperiment s; int ProtocolsCount = 0; LPWSAPROTOCOL_INFO info = s.GetProvider(&ProtocolsCount); if (ProtocolsCount != 0) { for (int i = 0; i < ProtocolsCount; i++) { wprintf(_T("Protocol:%s rn"), info[i].szProtocol); wprintf(_T("CatalogEntryId:%d         ChainLen:%d nn"), info[i].dwCatalogEntryId, info[i].ProtocolChain.ChainLen); } s.FreeProvider(info, ProtocolsCount); } getchar(); return 0; }执行:

    时间:2019-06-14 关键词: spi 网络编程

  • 新唐參考應用|KVM 无缝切换多台计算机的好帮手

    想象一下,外汇交易员正在紧盯世界各国汇率的变动,每分每秒随时准备下单交易时,而他的长桌上有着多部计算机主机,每台联机各国汇率的主机都配备着一台屏幕、一个键盘与一个鼠标,你觉得交易员位置会不会移来移去,漏看了一个重要的交易价格,找不到搭配该主机的键盘与鼠标,甚至用错鼠标或敲错键盘,导致重大的交易损失? 所以,他需要一台 KVM 切换器来帮助他,防止上述可能遇到的情境。 KVM 切换器,又名多计算机切换器,一般简称 KVM,即键盘、显示器、鼠标的英文首字母缩写(Keyboard、Video、Mouse),是一种计算机硬设备,使用户可以透过一组键盘、屏幕和鼠标控制多台计算机。利用特殊的线材(通常为 USB 或 VGA 线)将切换器连接至其余的计算机主机。接着透过切换器的开关或键盘上的按键去开关不同的计算机主机,可以将当前使用的计算机主机切换成另一台所选择的计算机主机讯号。 现在,新唐帮 KVM 客户考虑到了此应用的解决方案,在 NuMicro® M480 系列微控制器除了提供高、低管脚数的封装选型,且提供丰富的周边功能,可以满足客户在开发 KVM 所需的周边接口功能。例如多组高速 SPI 硬件,USB 部分也提供高速 2.0 与全速 1.1 的 OTG 接口,可以做为主机来连接 Hub,达成共接一组键盘、鼠标与屏幕即可操作多台计算机。 以下为使用 NuMicro® M480 系列微控制器的 KVM 应用示意图。利用芯片周边功能与新唐提供的 SPI 与 USB 主机端的程序参考范例,NuMicro® M480 系列可以让客户快速研发各种 KVM 产品,抓住市场需求。

    时间:2019-06-11 关键词: 微处理器 spi kvm

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包