精华内容
下载资源
问答
  • STM32常见通信方式(TTL、RS232、RS485、I2C,SPI,CAN)总结 一、TTL电平:全双工(逻辑1: 2.4V–5V 逻辑0: 0V–0.5V) 1、硬件框图如下,TTL用于两个MCU间通信 2、‘0’和‘1’表示 二、RS-232电平...

     

    STM32常见通信方式(TTL、RS232、RS485、I2C,SPI,CAN)总结

    一、TTL电平:全双工(逻辑1: 2.4V–5V   逻辑0: 0V–0.5V)

     

    1、硬件框图如下,TTL用于两个MCU间通信

     

    2、‘0’和‘1’表示

     

     

    二、RS-232电平:全双工(逻辑1:-15V–5V  逻辑0:+3V–+15V)

     

     

    1、硬件框图如下,TTL用于MCU与PC机之间通信

     

    2、‘0’和‘1’表示

     

     

    三、RS-485:半双工、(逻辑1:+2V–+6V  逻辑0: -6V—2V)这里的电平指AB 两线间的电压差。

     

    1、硬件框图如下

     

    2、‘0’和‘1’表示

     

     

     

    四、CAN总线:逻辑1:-1.5V–0V  逻辑0:+1.5V–+3V)这里的电平指CAN_High、CAN_Low 两线间的电压差。

     

    1、硬件框图如下

     

     

     

    2、‘0’和‘1’表示

     

     

    以上总结:

    1、从单片机软件编程角度来说,RS232、RS-485最终结果都是转换为TTL电平方式与单片机通信(CAN收发器把差分信号转化为TTL–>CAN控制器(MCU))。其目的都是提高通信质量,提高抗干扰能力。

    2、TTL、RS232是逻辑电平信号。RS-485、CAN为差分信号。

     

    五、I2C

     

    5.1 I2C物理层

     

    5.2 I2C协议层

     

    5.3 数据的起始信号与停止信号

     

    5.4数据有效性

    I2C 协议在 SCL 高电平时对 SDA 信号采样, SCL 低电平时 SDA准备下一个数据。
     

    SPI

    标准SPI

    标准SPI通常就称SPI,它是一种串行外设接口规范,有4根引脚信号:clk , cs, mosi, miso

    Dual SPI

    它只是针对SPI Flash而言,不是针对所有SPI外设。对于SPI Flash,全双工并不常用,因此扩展了mosi和miso的用法,让它们工作在半双工,用以加倍数据传输。也就是对于Dual SPI Flash,可以发送一个命令字节进入dual mode,这样mosi变成SIO0(serial io 0),mosi变成SIO1(serial io 1),这样一个时钟周期内就能传输2个bit数据,加倍了数据传输

    Qual SPI

    与Dual SPI类似,也是针对SPI Flash,Qual SPI Flash增加了两根I/O线(SIO2,SIO3),目的是一个时钟内传输4个bit

    所以对于SPI Flash,有标准spi flash,dual spi , qual spi 三种类型,分别对应3-wire, 4-wire, 6-wire,在相同clock下,线数越多,传输速率越高。

    btw:spi flash一般为NOR Flash

    SPI接口介绍
        SPI是由美国摩托罗拉公司推出的一种同步串行传输规范,常作为单片机外设芯片串行扩展接 口。SPI有4个引脚:SS(从器件选择线)、SDO(串行数据输出线)、SDI(串行数据输入线)和SCK(同步串行时钟线)。SPI可以用全双工通信 方式同时发送和接收8(16)位数据,过程如下:主机启动发送过程,送出时钟脉冲信号,主移位寄存器的数据通过SDO移入到从移位寄存器,同时从移位寄存 器中的数据通过SDI移人到主移位寄存器中。8(16)个时钟脉冲过后,时钟停顿,主移位寄存器中的8(16)位数据全部移人到从移位寄存器中,随即又被 自动装入从接收缓冲器中,从机接收缓冲器满标志位(BF)和中断标志位(SSPIF)置“1”。同理,从移位寄存器中的8位数据全部移入到主寄存器中,随 即又被自动装入到主接收缓冲器中.主接收缓冲器满标志位(BF)和中断标志位(SSPIF)置“1”。主CPU检测到主接收缓冲器的满标志位或者中断标志 位置1后,就可以读取接收缓冲器中的数据。同样,从CPU检测到从接收缓冲器满标志位或中断标志位置1后,就可以读取接收缓冲器中的数据,这样就完成了一 次相互通信过程。这里设置dsPIC30F6014为主控制器,ISD4002为从器件,通过SPI口完成通信控制的过程。


    SPI总线协议

    SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
           假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
           那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿到来的时候,sdi上的电平将所存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。
           例子:
           假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据

     

    脉冲    主机sbuff    从机sbuff    sdi    sdo
    0    10101010    01010101    0    0
    1上    0101010x    1010101x    0    1
    1下    01010100    10101011    0    1
    2上    1010100x    0101011x    1    0
    2下    10101001    01010110    1    0
    3上    0101001x    1010110x    0    1
    3下    01010010    10101101    0    1
    4上    1010010x    0101101x    1    0
    4下    10100101    01011010    1    0
    5上    0100101x    1011010x    0    1
    5下    01001010    10110101    0    1
    6上    1001010x    0110101x    1    0
    6下    10010101    01101010    1    0
    7上    0010101x    1101010x    0    1
    7下    00101010    11010101    0    1
    8上    0101010x    1010101x    1    0
    8下    01010101    10101010    1    0
    这 样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被 动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据 主机的名准备数据,主机在下一个8位时钟周期才把数据读回来

    SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。图3示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式(实线表示):


    SPI总线接口及时序
       SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传 输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿 (上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI总线接口时序如下所示。
     

    SPI功能模块的设计

    根据功能定义及SPI的工作原理,将整个IP Core分为8个子模块:uC接口模块、时钟分频模块、发送数据FIFO模块、接收数据FIFO模块、状态机模块、发送数据逻辑模块、接收数据逻辑模块以及中断形式模块。

    深入分析SPI的四种传输协议可以发现,根据一种协议,只要对串行同步时钟进行转换,就能得到其余的三种协议。为了简化设计规定,如果要连续传输多个数据,在两个数据传输之间插入一个串行时钟的空闲等待,这样状态机只需两种状态(空闲和工作)就能正确工作。
     

    CAN

    CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。
    它的通信速度较快,通信距离远,最高1Mbps(距离小于40米),最远可达10千里(速率低于5Kbps)。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

    CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
    本章,我们使用的是450Kbps的通信速率,使用的是ISO11898标准,该标准的物理层特征如图1所示:

    图1 ISO11898物理层特性
    从该特性可以看出,显性电平对应逻辑0,CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1,CAN_H和CAN_L之差为0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
    CAN协议是通过以下5种类型的帧进行的:
    l 数据帧
    l 摇控帧
    l 错误帧
    l 过载帧
    l 帧间隔
    另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。

    1.数据帧
    数据帧一般由7个段构成,即:
    (1) 帧起始。表示数据帧开始的段。
    (2) 仲裁段。表示该帧优先级的段。
    (3) 控制段。表示数据的字节数及保留位的段。
    (4) 数据段。数据的内容,一帧可发送0~8个字节的数据。
    (5) CRC段。检查帧的传输错误的段。
    (6) ACK段。表示确认正常接收的段。
    (7) 帧结束。表示数据帧结束的段。
    如图2为数据帧的构成:
    图2 数据帧的构成:
    图中D表示显性电平,R表示隐形电平(下同)。
    帧起始,标准帧和扩展帧都是由1个位的显性电平表示帧起始。
    仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,标准格式的ID 有11 个位。从ID28 到ID18 被依次发送。禁止高7 位都为隐性(禁止设定:ID=1111111XXXX,原因:can通信采用的是NZR编码,而can的仲裁是靠数据帧中的ID部分来实现的,全为隐性状态,可能导致仲裁失败!)。扩展格式的 ID 有29 个位。基本ID 从ID28 到ID18,扩展ID 由ID17 到ID0 表示。基本ID 和标准格式的ID 相同。禁止高7 位都为隐性(禁止设定:基本ID=1111111XXXX)。
    其中RTR位用于标识是否是远程帧(0,数据帧;1,远程帧),IDE位为标识符选择位(0,使用标准标识符;1,使用扩展标识符),SRR位为代替远程请求位,为隐性位,它代替了标准帧中的RTR位。
    控制段,由6个位构成,表示数据段的字节数。
    数据段,该段可包含0~8个字节的数据。从最高位(MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。
    CRC段,该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。
    ACK段,此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的。

    2.远程帧(遥控帧)
    远程帧作用:只发送ID号,不发送数据,它将ID发给另一台设备,请求另一台设备返回数据。

    3.CAN总线波特率设置
    位速率:由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
    l 同步段(SS)
    l 传播时间段(PTS)
    l 相位缓冲段1(PBS1)
    l 相位缓冲段2(PBS2)
    这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。
    1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
    1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。STM32把传播时间段和相位缓冲段1(STM32称之为时间段1)合并了,所以STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时间段1(BS1)和时间段2(BS2)。STM32的BS1段可以设置为1~16个时间单元,刚好等于我们上面介绍的传播时间段和相位缓冲段1之和。STM32的CAN位时序如图3所示:
    图3 STM32的CAN位时序
    图中还给出了CAN波特率的计算公式,我们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36Mhz),就可以方便的计算出波特率。比如设置TS1=6、TS2=7和BRP=4,在APB1频率为36Mhz的条件下,即可得到CAN通信的波特率=36000/[(7+8+1)*5]=450Kbps。图4是常见CAN总线的波特率设置:
    图4 常见波特率设置1
    图4 常见波特率设置2
    图4 常见波特率设置3
    图4 常见波特率设置4

    4.CAN总线屏蔽滤波
    STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(互联型),但是STM32F103ZET6只有14个(增强型),每个滤波器组x由2个32为寄存器,CAN_FxR1和CAN_FxR2组成。
    STM32每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
    ● 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
    ● 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
    此外过滤器可配置为,屏蔽位模式和标识符列表模式。
    在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
    而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。

    滤波过程举例:
    现有ID号为001,002,003,004的4个CAN,他们都能发送、接收广播报文。站在CAN002号角度看,它所能接受到报文的ID是通过滤波器滤波后的ID号,即这里将过滤方式分两种,一是002号能接收多个ID报文(屏蔽滤波模式),二是002号只能接收一个ID报文(标识符列表模式)。

    屏蔽滤波模式:
    标识符寄存器:0 0 1
    屏蔽寄存器: 1 0 1
    报文ID号: 0 0/1 1
    如果设置标识符寄存器和屏蔽寄存器为001和101;屏蔽滤波模式的作用是如果屏蔽寄存器某位上出现了1,则报文ID号对应的那位要与标识符寄存器那位一致,即“必须匹配”原则,所以标识符寄存器第一位0,报文ID号第一位也必须为0,因为屏蔽寄存器第一位为1,类似的第三位也是这样。如果屏蔽寄存器某位上出现了0,则报文ID号对应的那位可与标识符寄存器那位不一致也可以一致,即“不用关心”原则,第二位由于屏蔽寄存器上为0,所以报文ID号可以与标识符寄存器上的0一致也可以不一致,故报文ID号第二位为0/1。所以002号(010)可以接受来自001号(001)和003号(011)的报文。

    标识符列表模式:将设置的屏蔽寄存器改为标识符寄存器
    标识符寄存器:0 0 1
    标识符寄存器: 0 0 1
    报文ID号: 0 0 1
    如果设置2个标识符寄存器为001和001;报文ID号必须与这两个标识符寄存器所对应的位相等。所以002号CAN只能接受001号的报文。

    下图5是CAN_FMR寄存器,可以配置过滤器组的寄存器位数16还是32位,工作模式以及它和标准帧、扩展帧位数的对应关系,方便我们在不同的帧模式(标准数据帧、扩展数据帧、标准远程帧、扩展远程帧)下对报文ID进行过滤。
    图5 CAN_FMR寄存器

    5.CAN的发送与接收流程
    5.1CAN 发送流程
    发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符、数据长度和待发送数据;然后CAN_TIxR寄存器的TXRQ位置1,来请求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。当CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。邮箱中的报文被成功发送后,它马上变为空邮箱,硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,此时可以设置发送中断(入口地址:USB_HP_CAN_TX_IRQChannel()),进入中断置can_tx_flag_success=1,来表明一次成功发送。

    5.2CAN接收流程
    接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。接收相关的中断条件:
    一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求,可以进入接收中断读取接收的数据(入口地址:USB_LP_CAN_RX0_IRQChannel())。
    当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。
    在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求。

    6.CAN总线应用——CAN与上位机通讯实验(基于stm32f103zet6)
    6.1硬件设计
    本文的TX与RX采用PB9和PB8(端口重映射),他们与CAN收发器连接,CAN收发器(芯片有很多,如:TJA1050;SN65VD230)与USB/CAN转换器连接到PC机上,具体电路如图6。
    CAN收发器:
    图6 CAN收发器

    usb/can转换器:某宝上有卖,100多就行。

    6.2程序

    #include "pbdata.h"
    
    void RCC_Configuration(void);
    void GPIO_Configuration(void);
    void NVIC_Configuration(void);
    void CAN_Configuration(void);
    
    
    int main(void)
    {
    	CanTxMsg TxMessage;
    	
    	RCC_Configuration();	//时钟配置
    	GPIO_Configuration();//端口配置
    	NVIC_Configuration();
    	CAN_Configuration();
    	
    	
    	while(1)
    	{
    		//每隔1s发送一个报文,一个报文8B
    		TxMessage.StdId=0xFF00>>5;//标准帧只有31-21位,对于16位寄存器而言,低五位为扩展帧,所以在写16位数据时,最后5位置0
    		TxMessage.ExtId=0;
    		TxMessage.IDE=CAN_ID_STD;//选择发送标准帧
       		//TxMessage.StdId=0;
    		//TxMessage.ExtId=0xFFFFFFFF>>3;//扩展帧只有18位,在32位数据时最后三位为(IDE,RTR,TXRQ),所以在写扩展帧时,最后三位要置0
        
    		
    		//TxMessage.IDE=CAN_ID_EXT;
    		//发送扩展帧
    		TxMessage.RTR=CAN_RTR_DATA;//发送的是数据帧
    	//TxMessage.RTR=CAN_RTR_REMOTE;//远程帧,只发送ID,不发送数据,将ID发给另一台设备,请求另一台设备返回数据
    		TxMessage.DLC=8;//数据长度8B
    		
    		TxMessage.Data[0]=0x11;
    		TxMessage.Data[1]=0x22;
    		TxMessage.Data[2]=0x33;
    		TxMessage.Data[3]=0x44;
    		TxMessage.Data[4]=0x55;
    		TxMessage.Data[5]=0x66;
    		TxMessage.Data[6]=0x77;
    		TxMessage.Data[7]=0x88;
    		//数据内容
    		can_tx_success_flag = 0;
           CAN_Transmit(CAN1,&tx_message);//can发送数据
           while(can_tx_success_flag == 0);//是否一次发送成功
    		delay_ms(1000);//1s一次 
    	}	
    }
    
    void RCC_Configuration(void)
    {
        SystemInit();//72m
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
    }
    
    void GPIO_Configuration(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;	
    	
    	//端口重映射
    	GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
    
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//RX
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    	GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    	GPIO_Init(GPIOB,&GPIO_InitStructure);
    }
    
    void NVIC_Configuration(void)
    {
       	NVIC_InitTypeDef NVIC_InitStructure; 
    
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
    
    	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; 
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    	NVIC_Init(&NVIC_InitStructure);
    }
    
    void CAN_Configuration(void)
    {
    	//硬件上有个can/usb才能与PC通讯
       CAN_InitTypeDef CAN_InitStructure;
       CAN_FilterInitTypeDef CAN_FilterInitStructure;
    
       CAN_DeInit(CAN1);
       CAN_StructInit(&CAN_InitStructure);
    
       //关闭时间触发模式
       CAN_InitStructure.CAN_TTCM=DISABLE;
       //关闭自动离线管理
       CAN_InitStructure.CAN_ABOM=DISABLE;
       //关闭自动唤醒模式
       CAN_InitStructure.CAN_AWUM=DISABLE;
       //禁止报文自动重传
       CAN_InitStructure.CAN_NART=DISABLE;
       //FIFO溢出时报文覆盖源文件
       CAN_InitStructure.CAN_RFLM=DISABLE;
       //报文发送优先级取决于ID号,本次只用了一个发送邮箱,关闭TXFP
       CAN_InitStructure.CAN_TXFP=DISABLE;
       //工作模式(正常)
       CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
    
       //波特率设置125 KBPS
    
       CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
       CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;
       CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;
       CAN_InitStructure.CAN_Prescaler = 48;
    
    
       //初始化CAN
       CAN_Init(CAN1,&CAN_InitStructure);
    
       //屏蔽滤波(can接收才涉及)
       CAN_FilterInitStructure.CAN_FilterNumber=0;//0号滤波器
       //屏蔽滤波模式
       CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//标识符屏蔽位模式
       //32位寄存器
       CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
       //标识符寄存器高16位
       CAN_FilterInitStructure.CAN_FilterIdHigh=0x0F00;
       //标识符寄存器低16位
       CAN_FilterInitStructure.CAN_FilterIdLow=0;
       //屏蔽寄存器高16位
       CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0F00;
       //屏蔽寄存器低16位
       CAN_FilterInitStructure.CAN_FilterMaskIdLow=0;
       //过滤器将ID报文关联到FIFO0缓存区中,数据只能从这里导出
       CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
       //过滤器使能
       CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
       //初始化过滤器
       CAN_FilterInit(&CAN_FilterInitStructure);
    
       //接收中断使能
       CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
       //发送中断使能
       CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);
    }
    
    
    •  
    void USB_LP_CAN1_RX0_IRQHandler(void)
    {
    	CanRxMsg RxMessage;
    	CanTxMsg TxMessage;
    
    	//CAN接收
    	CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);//can接收的数据存在FIFO0的RxMessage里
    
    	TxMessage.StdId=RxMessage.StdId;//标准ID
    	TxMessage.ExtId=RxMessage.ExtId;//扩展ID
    	TxMessage.IDE=RxMessage.IDE;//标准帧还是扩展帧
    	TxMessage.RTR=RxMessage.RTR;//数据帧还是远程帧
    	TxMessage.DLC=RxMessage.DLC;//待传输数据长度
    
    	TxMessage.Data[0]=RxMessage.Data[0];
    	TxMessage.Data[1]=RxMessage.Data[1];
    	TxMessage.Data[2]=RxMessage.Data[2];
    	TxMessage.Data[3]=RxMessage.Data[3];
    	TxMessage.Data[4]=RxMessage.Data[4];
    	TxMessage.Data[5]=RxMessage.Data[5];
    	TxMessage.Data[6]=RxMessage.Data[6];
    	TxMessage.Data[7]=RxMessage.Data[7];
    	//CAN发送
    	CAN_Transmit(CAN1,&TxMessage);
    }
    
    •  

     

    展开全文
  • 通信类型 物理接口 通信协议 应用举例 串口 串行异步全双工 TX/RX 起始位+数据位+奇偶校验位+停止位 串口转USB,串口转485 SPI 串行同步全双工 CS/SCK/MISO/MOSI 同发同收,上升沿采样/下降沿采样 FLASH/OLED/...

    串行:数据按位传输;
    并行:数据并行发送;
    同步:发送端和接收端同时处理;
    异步:发送端和接收端不同时处理;
    单工:设备只能做发送端/接收端;
    半双工:设备同一时刻只能做发送/接收;
    全双工:设备同一时刻即可做发送又可做接收;

    \ 通信类型 物理接口 通信协议 应用举例
    串口 串行异步全双工 TX/RX 起始位+数据位+奇偶校验位+停止位 串口转USB,串口转485
    SPI 串行同步全双工 CS/SCK/MISO/MOSI 同发同收,上升沿采样/下降沿采样 FLASH/OLED/SD/触摸屏
    IIC 串行异步半双工 SCL/SDA 开始条件+设备地址+w/r+应答+数据+应答+……+停止位 SHT20 MPU6050 HP-6 7 寸电容屏
    8080 并行 CS/RD/WR/DC/D[16:0] 时序图 TFTLCD屏
    RS485 串行异步半双工 A/B 同串口 设备之间通信
    RS232 串行异步全双工 TX/RX 同串口 设备之间通信
    单总线 串行半双工 DAT 时序图 DHT11
    展开全文
  • stm32常见通信方式(TTL、RS232、RS485、CAN)总结

    万次阅读 多人点赞 2017-09-04 17:13:54
    1、硬件框图如下,TTL用于两个MCU间通信 2、‘0’和‘1’表示 二、RS-232电平:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V) 1、硬件框图如下,TTL用于MCU与PC机之间通信 2、‘0’和‘1’表示...

    一、TTL电平:全双工(逻辑1: 2.4V--5V   逻辑0: 0V--0.5V)

     

    1、硬件框图如下,TTL用于两个MCU间通信

     

    2、‘0’和‘1’表示

     

     

    二、RS-232电平:全双工(逻辑1:-15V--5V  逻辑0:+3V--+15V)

     

     

    1、硬件框图如下,RS-232用于MCU与PC机之间通信

     

    2、‘0’和‘1’表示

     

     

    三、RS-485:半双工、(逻辑1:+2V--+6V  逻辑0: -6V---2V)这里的电平指AB 两线间的电压差。

     

    1、硬件框图如下

     

    2、‘0’和‘1’表示

     

     

     

    四、CAN总线:逻辑1:-1.5V--0V  逻辑0:+1.5V--+3V)这里的电平指CAN_High、CAN_Low 两线间的电压差。

     

    1、硬件框图如下

     

     

     

    2、‘0’和‘1’表示

     

     

    以上总结:

    1、从单片机软件编程角度来说,RS232、RS-485最终结果都是转换为TTL电平方式与单片机通信(CAN收发器把差分信号转化为TTL-->CAN控制器(MCU))。其目的都是提高通信质量,提高抗干扰能力。

    2、TTL、RS232是逻辑电平信号。RS-485、CAN为差分信号。

     

    五、I2C

    5.1 I2C物理层

     

    5.2 I2C协议层

     

    5.3 数据的起始信号与停止信号

     

    5.4数据有效性

    I2C 协议在 SCL 高电平时对 SDA 信号采样, SCL 低电平时 SDA准备下一个数据。
     

    展开全文
  • 常见通讯方式RS232 RS485 TCP/IP介绍

    千次阅读 2014-12-16 14:08:06
    目前门禁控制器的常用通讯方式有RS-232,RS-485,TCP/IP三种方式。  RS-232通讯方式:由于RS-232的传输理论距离小于15米,所以一般仅用于小型系统。  RS-485通讯方式:RS-485通讯方式是多台控制器,通过RS-485...

       目前门禁控制器的常用通讯方式有RS-232,RS-485,TCP/IP三种方式。

        RS-232通讯方式:由于RS-232的传输理论距离小于15米,所以一般仅用于小型系统。

     RS-485通讯方式:RS-485通讯方式是多台控制器,通过RS-485通讯总线(必须用双绞线),将控制器通过串联的方式,一根总线接到 RS-485转换器(集线器)上,再接到计算机串口上,实现一台计算机对多台控制器的管理和通讯。

     负载数量:即一条485总线可以带多少台控制器,这取决于该控制器的通讯芯片和485转换器的通讯芯片的选型,一般有 32台、64台、128台、256台几种选择,这是理论的数字,实际应用时,受到现场环境、通讯距离等因素影响,负载数量达不到指标数;

        通讯距离及速度:控制器到计算机的连线理论上的距离是1200米;最大传输速率为10Mb/s,平衡双绞线的长度与传输速率成反比。  

        适用领域:门禁系统、LED控制系统、道闸系统等;

        传输原理:众所周知,RS-485接口采用的是一种差分传输方式,各节点之间的通信都是通过一对(半双工)或两对(全双工)双绞线作为传输介质。根据RS-485的标准规定,接收器的接收灵敏度为±200mV,即接收端的差分电压大于、等于+200 mV时,接收器输出为高电平;小于、等于-200mV时,接收器输出为低电平;介于±200mV之间时,接收器输出为不确定状态。

        使用注意事项:
          1.RS-485接口芯片在使用、焊接或设备的运输途中都有可能受到静电的冲击而损坏。在传输线架设于户外的使用场合,接口芯片乃至整个系统还有可能遭致雷电的袭击。
          2.RS-485是一种低成本、易操作的通信系统,但是稳定性弱同时相互牵制性强,通常有一个节点出现故障会导致系统整体或局部的瘫痪,而且又难以判断。
      
        RS-485控制器成本低廉,能够单独组网,并且不会受到其它设备的共用网络的干扰。缺点是组网数量有限,一般在1000台以内,设备越多受到干扰越大;同时组网范围有限,通讯速度比较慢,对于过万人或过百门的大型门禁系统,上传权限和下载记录等操作速度均比较慢。而需要增加点位时,又必须重新布线,会产生附加的成本(例如:装修等),也不适合点位分布在不同地域又需要集中管理的项目。

      TCP/IP通讯方式:TCP/IP 通讯方式采用计算机网络通用性标准协议,具备传输速度快,国际标准,兼容性好等优点,其接入方式与局域网的HUB及计算机网卡的接入方式相同。

      负载数量:理论上没有限制,HUB可以级联;
      通讯距离及速度:在小型局域网内,每一级的通讯距离达100米,可以通过HUB的级联延长通讯距离,跨城市甚至实现数千公里以外的联网;通讯速度快,是RS-485/RS-232控制器的十倍甚至数十倍;每秒上传权限或者下载记录达数百条。

      TCP/IP 控制器的优点在于采用国际标准的流行通讯协议,先进性和性能都比较好,组网数量理论上是无限制,组网范围广,可以跨地区,甚至跨国界,通讯速度快,适合大型门禁系统;通讯质量稳定,不容易受到外界干扰。如果用户已经有局域网可以利用现有网络进行组网。在增加点位时,可以利用就近已经存在的局域网,适合任意的系统。其缺点是成本会稍高于RS-485控制器。如果是大型系统,网络管理和网络安全会成为新的问题。

    展开全文
  • 一、TTL电平:全双工(逻辑1: 2.4V--5V 逻辑0: 0V--0.5V)1、硬件框图如下,TTL用于两个MCU间通信2、‘0’和‘1’表示二、RS-232电平:全双工(逻辑1:-15V--5V 逻辑0:+3V--+15V)1、硬件框图如下,TTL用于MCU与PC...
  • 一、TTL电平:全双工(逻辑1: 2.4V...1、硬件框图如下,TTL用于两个MCU间通信 2、‘0’和‘1’表示 二、RS-232电平:全双工(逻辑1:-15V–5V  逻辑0:+3V–+15V) 1、硬件框图如下,TTL用于MC...
  • 管道:只能单向传递,且只能在有亲缘关系的进程中使用 ... 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。  共享内存:由一个进程创建,但多个进程都可以访问。往往与其
  • 常见的进程通信方式

    2018-07-31 10:38:41
    1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系...
  • 常见的几种通信方式整理

    千次阅读 2017-01-06 09:16:18
    常见的几种通信方式整理 http wifi wifi介绍 蓝牙 串口 gpio 红外线 socket nfc
  • 金融行业常见的报文格式与通讯方式
  • 1.Intent 2.Handler 3.Interface 4.Broadcast 5.Aidl 6.Messenger
  • 对于点对点之间的通信,按照消息传送的方向与时间关系,通信方式可分为单工通信、半双工通信及全双工通信三种。 单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。 半双工通信(Half-duplex ...
  • 嵌入式中常见的几种通讯方式

    千次阅读 2020-07-01 21:05:22
    盘点一下:常见的几种通讯方式 (一) UART-通用异步串行数据总线 ➢201kbps-10Mbps 应用于低速通讯,对应电平标准有RS232/RS422/RS485. 如电脑中口,工控机串口,芯片调试接口等。 ➢优缺点: 简单,速度慢 另外科普...
  • 一些通信原理常见的码型原理及其编码方式,对于课程设计会有帮助。
  • linux下进程间通信的几种主要手段简介: ...信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信
  • 说到低功耗蓝牙模块,少不了要说说低功耗蓝牙模块中最简单、最常见通讯方式——透传。透传也叫串口透传,就是透明传输的意思,透传是一种工作方式,不是一种功能,一般出现在串口模块中(蓝牙串口透传模块是为了让...
  • 进程间常见通信方式 管道/匿名管道:父子进程/兄弟进程之间的通信方式 没有名字的管道如何通信,当然是亲近的进程之间 有名管道:任意进程间可以通信。严格遵守FIFO(先进先出)原则,并以磁盘文件的方式...
  • 常见进程间的几种通信方式以及使用注意点 通常情况下进程间的通信方式主要有以下几点: 此处只是介绍相关工作过程及概念,具体代码,网上一抓一大片,可以自己看。 1、管道: 管道通常分类两种,一种有名管道,一...
  • C++对象之间通信的三种常见方式

    万次阅读 2017-11-03 18:53:19
    经过这一年多对C++的使用,总结出了下边的三种常见对象之间的通信方式。这里就不上代码了。只作为一种设计思想,记录下来方便自已以后使用,和大家一起学习,这只是自已在工作中的总结,如果谁有更好的经验,请回复...
  • 两种常见的Vlan间通信方式

    万次阅读 2018-08-15 17:35:10
    一:三层交换机方式 二:单臂路由方式 一:三层交换机方式  如图,PC1和PC2是企业内网的主机,属于不同的部门,故属于不同的VLAN。在交换机上配置vlan 10和vlan 20,并且配上主机的网关。交换机与路由器相邻的...
  • 理解几种常见的进程间通信方式

    千次阅读 2015-10-08 11:32:40
    什么是进程间通信广义上讲,进程间通信(Inter-Process Communication, IPC)是指运行在不同进程(不论是否在同一台机器)中的若干线程间的数据交换。从上面的定义可以得出两点: 参与通信的进程即可以运行在同一台机器...
  • 首先声明知识必须站在巨人的肩膀上,所以本文部分内容参加,如下两篇blog: http://blog.163.com/luyanbinaiwx@126/blog/static/91941358201459644542/; ... ...网络编程主要包括两种通信方式:TCP/IP通信和U
  • 几种常见进程间通信(IPC)方式-管道pipe 前言 进程间通信是指在不同进程之间传播或...常见通信方式有以下几种: 管道pipe 有名管道FIFO 消息队列MessageQueue 共享存储 信号量Semaphore 信号Signal 套接字Sock...
  • 1 “通信”与“通讯”傻傻分得清 传统意义上的“通讯”主要指电话、电报、电传。通讯的“讯”指消息(Message),媒体讯息通过通讯网络从一端传递到另外一端。媒体讯息的内容主要是话音、文字、图片和视频图像。其...
  • 几种常见进程间通信(IPC)方式-共享存储 前言 进程间通信是指在不同进程之间传播或...常见通信方式有以下几种: 管道pipe 有名管道FIFO 消息队列MessageQueue 共享存储 信号量Semaphore 信号Signal 套接字Socket...
  • 一、前提知识1)网络编程主要包括两种通信方式:TCP/IP通信和UDP通信;前者是属于可靠地,端到端的字节流通信协议;后者是一种不可靠的连接。2)Socket:两台机器建立一个双向的网络连接实现数据交换,这个双向链路的...
  • 几种常见进程间通信(IPC)方式-信号 前言 进程间通信是指在不同进程之间传播或...常见通信方式有以下几种: 管道pipe 有名管道FIFO 消息队列MessageQueue 共享存储 信号量Semaphore 信号Signal 套接字Socket ...
  • 物联网基础知识介绍一、物联网定义二、物联网的特征三、常用的无线通信方式比较四、常用的无线通信应用开发五、物联网体系结构 一、物联网定义 物联网(Internet of Things)指的是将无处不在(Ubiquitous)的末端设备...
  • 阅读大纲: 串行通讯和并行通讯的概念 ... spI,uart,I2C基本常见通讯解析 1.首先弄懂串行通信和并行通信以及串口通信和并口通信的概念。 串行通行:它是一个概念,它是指数据一位一位地顺序传送,其特点就...
  • Vue的通信方式,也可以说是传参方式。主要分为四种: 父子传参 子父传参 相邻兄弟传参(亲兄弟) 远兄弟传参(表兄弟) 一、父子传参 原理:父控制子,通过子组件的props属性,抛出子组件自定义标签属性,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 335,193
精华内容 134,077
关键字:

常见的通信方式