总线协议_spi总线协议 - CSDN
精华内容
参与话题
  • 各种总线协议简介

    千次阅读 2017-09-28 00:55:54
    IICI2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向...

    IIC

    I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。
    它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上,IIC是半双工通信方式。多主机I2C总线系统结构 需要将SDA和SCL两根线接上拉电阻拉高。

    开始信号+7位设备地址+R/W+ASK+8bit数据+ASK+8bit数据+NASK+停止信号

    这里写图片描述

    (1)空闲状态
    I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

    (2)起始信号与停止信号
    起始信号:当SCL为高期间,SDA由高到低的跳变。
    停止信号:当SCL为高期间,SDA由低到高的跳变。

    (3)应答信号ACK
    对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。

    (4)数据有效性
    数据在SCL的上升沿到来之前就需准备好,并在在下降沿到来之前必须稳定。也就是要求数据在SCL高电平期间保持稳定。

    SPI

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

    4根线:

    1. MISO 主机输入从机输出
    2. MOSI 主机输出从机输入
    3. SCLK 时钟信号 主设备产生
    4. CS 片选 主设备产生

    主机对外设的读写操作都是同步的,如果只进行写操作,主机只需忽略接收到的字节;
    若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

    配置CPOL(时钟极性)CPHA(时钟相位)4种模式

    00 空闲状态低电平,第1个边沿数据传输
    01 空闲状态低电平,第2个边沿数据传输
    10 空闲状态高电平,第1个边沿数据传输
    11 空闲状态高电平,第2个边沿数据传输

    CAN

    简介:
    CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。

    特点:

    1. 多主控制。
    2. 系统柔软性。连接总线的单元,没有类似“地址”的信息,因此,在总线上添加单元时,已连接的其他单元的软硬件和应用层都不需要做改变。
    3. 速度快,距离远。最高1Mbps(距离<40M),最远可达10KM(速率<5Kbps)。
    4. 具有错误检测、错误通知和错误恢复功能。
    5. 故障封闭功能。
    6. 连接节点多。

    物理特征:

    这里写图片描述

    1. CAN-H和CAN-L的电位差确定总线电平:显性电平0(压差2V)和隐性电平1(压差0V)。
    2. 显性优先,只要一个单元输出显性电平,总线上即为显性电平;
      隐性包容,只有所有单元输出隐性电平,总线上即为隐性电平。
    3. 如果超过一个单元在同一时刻发送信息,优先级竞争,具有最高优先级ID的单元获得发送的资格,其他单元执行接收操作。
    4. 在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

    数据帧:发送单元通过此帧向接收单元发送信息。
    遥控帧:接收单元通过此帧向相同ID的发送单元请求数据。
    数据帧和遥控帧标准格式有11bit的ID,扩展格式有29bit的ID。

    数据帧:由发送单元使用,用来发送信息给接收单元
    (1)帧开始(SOF):这个域表示数据帧的开始 1bit显性电平
    (2)仲裁域(ID+RTR):这个域表示一个帧的优先级
    (3)控制域:这个域表示保留位和数据字节数
    (4)数据域:0~8个字节的数据内容
    (5)CRC 域:这个域用于检查帧的传输错误
    (6)ACK 域:是对帧已经被正常接收的一个证实
    (7)帧结束(EOF):指示数据帧结束

    遥控帧:是接收单元请求发送单元发送一个信息
    (1)帧开始:这个域表示数据帧的开始 1bit显性电平
    (2)竞争域:这个域表示数据的优先级,具有同样ID的数据帧被请求
    (3)控制域:这个域表示保留位和数据字节数
    (4)CRC 域:这个域用于检查帧的传输错误
    (5)ACK 域:是对帧已经被正常接收的一个证实
    (6)帧结束:指示遥控帧的结束

    11位基本ID禁止高7位为隐性,即不能ID=1111111XXXX,所以理论上基本ID模式CAN总线上最多可以挂载2048-16=2032个节点
    相同ID的数据帧和遥控帧竞争时,仲裁段最后一位RTR为显性电平的数据帧具有优先权

    总线仲裁
    1.总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占
    2.如果有多个单元同时发送,则连续输出显性电平多的单元具有较高的优先级
    3.从ID开始比较,如果ID相同,比较RTR

    STM32 CAN控制器-标识符筛选器
    1.标识符掩码模式-过滤出一组标识符-CAN_F0R1=0xFFFF0000,CAN_F0R2=0xFF00FF00 期望收到0xFFFF0000 可收到0xFFXX00XX。
    2.标识符列表模式-过滤出一个标识符。

    展开全文
  • 各类总线以及控制协议对比学习

    千次阅读 2018-09-10 09:11:54
    SCI是包括UART的,UART是通信协议,SCI是接口;SCI用于串行通信,如RS422,RS485,RS232; 补充:关于RS422,RS485,RS232 RS232:全双工,单站(只能挂一个收发器),波特率20Kbps,电平是负逻辑,-15~-3V是逻辑1...

    1.SCI(通用异步收发器)

    两线制,全双工,内部时钟提供速率,需要UART发送器接收器,两线,一根用于发送,一根用于接收。

    SCI是包括UART的,UART是通信协议,SCI是接口;SCI用于串行通信,如RS422,RS485,RS232;

    补充:关于RS422,RS485,RS232

    RS232:全双工,单站(只能挂一个收发器),波特率20Kbps,电平是负逻辑,-15~-3V是逻辑1,对应的正的表示0,一般来说处理两线外还需要一根地线;

    RS422:全双工,四线制,差分信号,抗干扰升级,逻辑0和逻辑1用电平差判断;

    RS485:两线,半双工,最多可挂在128个收发器,最大速率10Mbps,差分,逻辑1差分为+2~+6(电压降低避免损坏芯片),距离可达到3000m

    资料来源:http://www.elecfans.com/emb/jiekou/20180418663969.html

    2.I2C

    IIC最大的优势在于通过[开漏输出]和[上拉电阻两个物理特性简化了协议整体的设计和实现]

    两线制长总线,半双工,用于连接微控制器和外设,由数据线SDA和SCL构成,正常速度为100kbits,高速IIC总线一般可达400kbps,多为半双工通信,多主机I2C总线系统需要将SDA和SCL两根线上拉电阻拉高。

    上拉电阻:(两个连接到总线VCC的上拉电阻)因为开漏输出的特性,所以需要上拉电阻来提供高电平,当输出端输出高阻态时并且没有其它设备拉低总线时,总线被外部上拉电阻拉高,呈现高电平状态;(上拉电阻设涉及到通信速率和功耗的取舍,上拉电阻越大,信号上升时间越长,速率越低,阻值过小,低电平时功耗大,此外,电容也会影响上升时间I2C总线电容400pf限制)

    开漏输出:开漏输出为低电平和高阻态两个状态,使得总线只受到输出低电平的影响,从而实现线与(当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,此时总线被称为占用转态)的功能】;

    程序设计时需要注意发送结束后要清除SCLK,否则设备就会认为还没有到响应结束,从而影响下一次开始时钟;

    空闲状态:SDA和SCL两条信号同时处于高电平时,总线为空闲状态;

    开始信号:SCL为高,SDA高到低;

    结束信号:SCL为高,SDA低到高;

    3.SPI

    串行外设设备接口,高速(Mbits级别)可以达到30Mbits,全双工,同步的总线通信,四线制(MISO,MOSI,SCLK,CS-没有多设备的时刻可以不需要),主要应用在EEPROM,FLASH,时钟,AD转换,数字信号处理和信号解码器之间;

    4.CAN总线

    • 双线差分信号;(1Mbits<=40m);
    • 多主站结构(协议对点的数量没有限制,正常最多110个);
    • 每个报文的内容通过标识符辨别,网络中唯一;性

    显性电平为逻辑0,因为线与的机制,0的时候表示了总线处于非空闲的状态,显性位覆盖隐性位;

    NRZ编码方式-保证相同带宽的情况下,NRZ包含的信息量更大;

    此图上为高速CAN(500k),下为低速容错CAN(125k);

    高速CAN的容错性TJA1040:CAN_L对GND可以短路;

    低速容错CANTJA1054:CAN_H和CAN_L可以分别开路短路;

    ?关于为什么汽车控制器很少有1M的CAN,从成本角度考虑,CAN收发器的成本会上升,此外500K足够使用了;

    标准帧11位ID,扩展帧29位ID;

    首位是SOF为一个显性位,逻辑0,用于数据同步;

    DLC:数据长度码;

    ACK:为了确保报文被至少一个节点正确接收,接收成功后置0,原本为1,回读为0后,确认被接收;

    EOF:7干扰连续隐性位,表示数据结束,节点在检测到11个连续的隐性位后认为总线空闲;

    数据链路层:

    • 回读机制:总线空闲发送,发送过程中回读,判断发送位和回读位是否一致,即检测是否有别的节点发报文;
    • 线与优先级:ID越小优先级越高;
    • 非破坏性仲裁:并行的发送变成了串行的发送,这样的机制存在的一是一是因为在A优先级高先发送后,BCD可能会同时检测发送,此时需要检测排队;
    • 接收多帧报文:过滤器-过滤到不要的ID;屏蔽-设置是否生效(不生效的位置,ID可变,可以检测多帧)
    • NRZ编码,存储量更大,但是边沿变化少,所以引入位填充;

    LIN总线:

    6位ID;单主节点,多从节点,最多16个节点;(基于UART/SCI接口,节省成本)

    20Kbit/s;

    进度表:规定帧ID的传输次序;规定帧时隙;

    展开全文
  • 通信总线协议学习整理

    千次阅读 2018-07-28 17:41:44
    UART是一个大家族,其包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。 嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。常用的就三根...

    一、UART

    UART是一个大家族,其包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。

    嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。常用的就三根引线:发送线TX、接收线RX、电平参考地线GND。

     1.1    电路示意图

     

    1.2    通信协议

    将传输数据的每个字符一位接一位地传输。

     

    起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

    数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。

    奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

    空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

    波特率:数据传输的速率。有以下几个档位:300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200.当然也可以自定义。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。

     

    二、IIC 总线

    I²C (Inter-Integrated Circuit)。其拥有一根数据线SDA和一根时钟线SCL。其总线通过上拉电阻与电源相连接。每个接到I2C总线上的器件都有唯一的地址。其中,主动发起操作的一方为主机,另外一方为从机。

    1.1   电路示意图

     

    1.2 数据传输

    当没有数据传输的时候,两根总线都为高电平;当采集IIC上的数据时,其时钟线SCL必须是高电平且SDA的数据必须保持稳定不变---将SDA的电平与SCL的高电平进行“与”操作后,以便确定SDA上是1还是0;在SCL为低电平的时候,SDA上的数据可以进行跳变。

    数据传输开始时,需要发送一个起始信号;数据传输结束后,需要发送一个终止信号;每8bit数据传输结束,都需要一个ACK。起止信号都有Master发出,而ACK则可能由Master或者SLAVE来发出。数据的传输采用大端传输。

    开始信号:SCL为高电平,SDA的电平由高跳到低表示开始信号。

    终止信号:SCL为高电平,SDA的电平由低跳到高表示终止信号。

                      

     

    1.3 数据协议

            

     

    1.4   I2C读写流程

     

    参考:

    http://dpinglee.blog.163.com/blog/static/14409775320112239374615

    https://en.wikipedia.org/wiki/I%C2%B2C

    http://wenku.baidu.com/view/7c310976f46527d3240ce0e5

    http://wenku.baidu.com/view/bdb46aa60029bd64783e2c6f

     

    三、SPI总线

    SPI(Serial Peripheral Interface)是一种串行串行同步通讯协议,由一个主设备和一个或多个从设备组成。其拥有四根(类)硬脚引线,分别为 SDI(串行数据输入),SDO(串行数据输出),SCK(串行移位时钟),CS(片选)。因为一个主设备可以挂多个从设备,则通过片选引脚对从设备进行选择。从设备的工作时钟则是来自于主设备的SCK线。

    1.1    电路示意图

     

     

    1.2    数据的传输

    SPI在数据传输的时候,需要确定两件事情:其一,数据是在时钟的上升沿采集还是下降沿采集;其二,时钟的初始(空闲)状态是为高电平还是低电平。而I2C的空闲状态,时钟线为高电平;数据采集的时候,时钟线也为高电平。但SPI给出了更自由的方式。

    CPOL:时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平。

    CPHA:时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。

    那么,SPI CPOL有两种可能,CPHA有两种可能,则SPI数据传输就有四种可能---按照标准的说法,SPI数据传输就有四种模式。

     

    1.3    SPI读写

    SPI在硬件设计上采用的双数据线制,根据设计,在SPI通信过程中,主从设备之间会形成一个数据环形链路---也即是,主设备向从设备写一次数据,从设备就会回一次数据(至于该从设备回复的数据是否有效,则另当别论---如果有效,主设备就把它读入;如果无效,则丢弃即可)。

     

    展开全文
  • 总线协议汇总(一)- IIC

    千次阅读 2019-07-07 20:43:16
    由于学习需要,我总结一下各种通讯协议,方便自己也方便各位朋友。 通讯协议概念:通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错...

    由于学习需要,我总结一下各种通讯协议,方便自己也方便各位朋友。

    通讯协议概念:通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程

    一、IIC(Inter-Integrated Circuit)

    IIC有两种实现方式:模拟IIC硬件IIC
    模拟IIC优点是可以任意选择SDA和SCL,不受管脚限制而比较灵活。它的缺点是不可用DMA,所以不用这功能的时候还是很方便的。
    硬件IIC优点是可用DMA减轻CPU负担,速度也比模拟IIC快,但是实际调试时可能会出现BUG(死机)。

    感兴趣的话可以看一下 血的经历告诉大家,慎用stm32的硬件iic

    说明一下 SDA:双向数据线 SCL:时钟线 (IIC是所有总线协议里面用最少引脚的)

    一般100K的通信速率,SCL,SDA都是加4.7K的上拉电阻。通信速率越大,电阻建议越小,这个也跟电路板的分布电容有关。

    IIC时序图
    由上面的时序图可以看到,I2C的通讯流程大致为:开始信号(下降沿)、发送7位地址、发送读/写指令、应答信号、数据传输、应答信号…数据传输、非应答信号、停止信号(上升沿)。

    (一)模拟IIC

    #define uchar   unsigned char
    #define uint    unsigned int	
    
    #define SCL_H  GPIO_SetBits(GPIOA, GPIO_Pin_6)
    #define SCL_L   GPIO_ResetBits(GPIOA, GPIO_Pin_6)
    #define SDA_H   GPIO_SetBits(GPIOA, GPIO_Pin_7)
    #define SDA_L   GPIO_ResetBits(GPIOA, GPIO_Pin_7)
    
    #define SCL_read GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
    #define SDA_read GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)
    		 
    /***************************************************************
    *	FunctionName:	I2C_delay
    *	Function:		DELAY
    *	Arguments:		None
    *	Return:			None
    *	Author			seanOY
    ****************************************************************/         
    void I2C_delay(void)
    {	
       uchar i=10;     //可以通过修改i的值提升IIC运行速度
       while(i) 
         i--; 
    }
    
    void delayms(void)
    {	
       int i=10000;  		//延时一定要够,不然会出BUG
       while(i--); 
    }       
    
    /****************************************************************
    *	FunctionName:	I2C_GPIO_Config
    *	Function:		Configure IIC GPIO
    *	Arguments:		None
    *	Return:			None
    *	Author			seanOY
    *****************************************************************/
    void I2C_GPIO_Config(void)
    {
      GPIO_InitTypeDef  GPIO_InitStructure; 
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
      GPIO_Init(GPIOB, &GPIO_InitStructure);
    
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
      GPIO_Init(GPIOB, &GPIO_InitStructure);
    }
    
    /***************************************************************
    *	FunctionName:  I2C_Start
    *	Function:     Start Simulate IIC Communication
    *	Arguments:    None
    *	Return:      bool flag
    *	Author:      seanOY
    ****************************************************************/   
    bool I2C_Start(void)
    {
    	SDA_H;
    	SCL_H;
    	I2C_delay();
    	if(!SDA_read)return false;	//SDA线为低电平则总线忙,退出
    	SDA_L;
    	I2C_delay();
    	if(SDA_read) return false;	//SDA线为高电平则总线出错,退出
    	SDA_L;
    	I2C_delay();
    	return true;
    }
    
    /******************************************************************
    *	FunctionName:  I2C_Stop
    *	Function:     Stop Simulate IIC Communication
    *	Arguments:    None
    *	Return:      None
    *	Author:      seanOY
    ******************************************************************/   
    void I2C_Stop(void)
    {
    	SCL_L;
    	I2C_delay();
    	SDA_L;
    	I2C_delay();
    	SCL_H;
    	I2C_delay();
    	SDA_H;
    	I2C_delay();
    } 
    
    /*******************************************************************
    *	FunctionName:  I2C_Ack
    *	Function:     Send Acknowledgement signal
    *	Arguments:    None
    *	Return:      None
    *	Author:      seanOY
    ********************************************************************/  
    void I2C_Ack(void)
    {	
    	SCL_L;
    	I2C_delay();
    	SDA_L;
    	I2C_delay();
    	SCL_H;
    	I2C_delay();
    	SCL_L;
    	I2C_delay();
    }   
    
    /********************************************************************
    *	FunctionName:  I2C_NoAck
    *	Function:     Send Not Acknowledgement signal
    *	Arguments:    None
    *	Return:      None
    *	Author:      seanOY
    ********************************************************************/  
    void I2C_NoAck(void)
    {	
    	SCL_L;
    	I2C_delay();
    	SDA_H;
    	I2C_delay();
    	SCL_H;
    	I2C_delay();
    	SCL_L;
    	I2C_delay();
    } 
    
    /**************************************************************************
    *	FunctionName:  I2C_WaitAck
    *	Function:     Wait for Acknowledgement signal from slave
    *	Arguments:    None
    *	Return:      bool flag
    *	Author:      seanOY
    ***************************************************************************/  
    bool I2C_WaitAck(void) 	 //返回为:=1有ACK,=0无ACK
    {
    	SCL_L;
    	I2C_delay();
    	SDA_H;			
    	I2C_delay();
    	SCL_H;
    	I2C_delay();
    	if(SDA_read)
    	{
         SCL_L;
    	  I2C_delay();
          return false;
    	}
    	SCL_L;
    	I2C_delay();
    	return true;
    }
    
    /**************************************************************************
    *	FunctionName:  I2C_SendByte
    *	Function:     Send a Byte to Slave
    *	Arguments:    None
    *	Return:      None
    *	Author:      seanOY
    ***************************************************************************/  
    void I2C_SendByte(u8 SendByte) //数据从高位到低位
    {
        u8 i=8;
        while(i--)
        {
            SCL_L;
            I2C_delay();
          if(SendByte&0x80) //取最高位
            SDA_H;  
          else 
            SDA_L;   
            SendByte<<=1;//下一位
            I2C_delay();
    		SCL_H;
            I2C_delay();
        }
        SCL_L;
    }  
    
    
    /**************************************************************************
    *	FunctionName:  I2C_RadeByte
    *	Function:     Receive a Byte from Slave
    *	Arguments:    None
    *	Return:      unsigned char Data
    *	Author:      seanOY
    ***************************************************************************/  
    unsigned char I2C_RadeByte(void)  //数据从高位到低位//
    { 
        u8 i=8;
        u8 ReceiveByte=0;
    
        SDA_H;				
        while(i--)
        {
          ReceiveByte<<=1;      
          SCL_L;
          I2C_delay();
    	  SCL_H;
          I2C_delay();	
          if(SDA_read)
          {
            ReceiveByte|=0x01;
          }
        }
        SCL_L;
        return ReceiveByte;
    }      
    
    /**************************************************************************
    *	FunctionName:  Single_Write
    *	Function:     Write a Byte to an address
    *	Arguments:    None
    *	Return:      bool flag
    *	Author:      seanOY
    ***************************************************************************/  
    bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)		    
    {
        if(!I2C_Start())return false;
        I2C_SendByte(SlaveAddress);   
        if(!I2C_WaitAck()){I2C_Stop(); return false;}
        I2C_SendByte(REG_Address );   //设置低起始地址      
        I2C_WaitAck();	
        I2C_SendByte(REG_data);
        I2C_WaitAck();   
        I2C_Stop(); 
        delayms();
        return true;
    }
    
    /**************************************************************************
    *	FunctionName:  Single_Read
    *	Function:     Read a Byte from an address
    *	Arguments:    None
    *	Return:      unsigned char Data 
    *	Author:      seanOY
    ***************************************************************************/  
    unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
    {   unsigned char REG_data;     	
        if(!I2C_Start())return false;
        I2C_SendByte(SlaveAddress); 
        if(!I2C_WaitAck()){I2C_Stop();test=1; return false;}
        I2C_SendByte((u8) REG_Address);   //设置低起始地址      
        I2C_WaitAck();
        I2C_Start();
        I2C_SendByte(SlaveAddress+1);
        I2C_WaitAck();
        REG_data= I2C_RadeByte();
        I2C_NoAck();
        I2C_Stop();
        return REG_data;
    }						      
    
    /**************************************************************************
    *	FunctionName:  WriteNByte
    *	Function:     Write N Bytes to an address range
    *	Arguments:    SlaveAddress:   salve address
                 REG_Address:      register address(write/read)
                data[]:                data that ready for write
                 NumOfByte:         length of data[]
    *	Return:      None
    *	Author:      seanOY
    ***************************************************************************/  
    void WriteNByte(unsigned char SlaveAddress, unsigned char REG_Address, unsigned char data[], unsigned char NumOfByte)
    {
    	uchar i ;
    	for(i=0;i<NumOfByte;i++)
    	{
    		Single_Write(SlaveAddress, REG_Address+i, data[i]);
    //		printf("%d ,",data[i]);
    	}
    }
    
    /**************************************************************************
    *	FunctionName:  ReadNByte
    *	Function:     Read N Bytes from an address range
    *	Arguments:    SlaveAddress:   salve address
                 REG_Address:      register address(write/read)
                data[]:                data that ready for write
                NumOfByte:         length of data[]
    *	Return:      None
    *	Author:      seanOY
    ***************************************************************************/  
    void ReadNByte(unsigned char SlaveAddress, unsigned char REG_Address, unsigned char *data, unsigned char NumOfByte)
    {
    	int i ;
    	for(i=0;i<NumOfByte;i++)
    	{
    		*(data+i)=Single_Read(SlaveAddress, REG_Address+i);
    		delayms();      //大概0.7ms,如果出错稍微加大应该可以
    //		printf("%d ,",*(data+i));
    	}
    }
    

    (二)硬件IIC

    ST的STM32F10XX的硬件各种总线协议汇总(IIC)(一)IIC库(可下载)

    我根据上面ST的库来修改了一下,所以也可下载我修改过的程序(来支持我)哦!^0^
    硬件IIC可通过选择轮询(Polling),中断(Interrupt)或直接存储器存取(DMA)来进行操作,用的时候可以自行选择!

    Polling Interrupt DMA
    优点 简易,可改变轮询顺序 省时(相对于polling) 用于高速设备,省时(相对于polling)
    缺点 由于速度上CPU>>IO设备,不适合用于高速设备 需要有中断信号和中断服务进程 需要有DMA控制器
    展开全文
  • AHB总线协议

    千次阅读 多人点赞 2019-05-19 21:34:14
    AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。...
  • IIC总线协议详解

    万次阅读 多人点赞 2018-08-21 21:03:41
    1 I2C总线物理拓扑结构    I2C 总线在物理连接上非常...通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻...
  • CAN总线传输协议

    万次阅读 多人点赞 2019-07-16 22:13:03
    一、控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线、同轴电缆或光纤来传输信号,因其高性能、高可靠性和高实时性等特点,已经成为了世界上应用最广泛的...
  • 解析单总线协议(1-wire)

    万次阅读 多人点赞 2016-12-06 20:23:39
    一、单总线协议(1-wire) 1.定义:主机和从机通过1根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制。 2.特点:这是由达拉斯半导体公司推出的一项通信技术。它采用单根信号线,既可传输时钟,又能传输...
  • I2C总线协议详解

    万次阅读 多人点赞 2014-08-18 16:29:57
    通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。 1.1.2 I2C总线特征  
  • RS485总线传输协议

    千次阅读 2019-07-17 11:10:49
    一、RS485总线传输协议是一种串行总线通信协议标准,RS485总线采用平衡发送,差分接收的结构设计,因此具有抑制共模干扰的能力。RS485总线的数据传输速率最高可达10Mbps,最远传输距离可达1000米左右。RS485不是点对...
  • 1,DS18B20数字温度传感器的主要特点 通信采用1-Wire接口 每个DS18B20都有唯一的64位序列码储存在板载ROM中 无需外部元件 可从数据线供电,电源范围为3.0V ~ 5.5V。 可测量的温度范围在-55℃ ~ +125...单总线(1-w
  • Modbus协议和CAN总线

    千次阅读 2016-09-15 16:47:56
    Modbus和CAN做为两种工业上常用的总线协议在仪器仪表,汽车,轨道交通设备上获得了广泛的使用. CAN总线由德国BOSCH公司开发,设计初衷是为汽车上电子设备提供互联,经过多年的发展,现在几乎所有的汽车级MCU都包含有CAN...
  • 1553B总线通信协议

    千次阅读 2019-04-01 16:40:09
    1553B总线通信协议 1553B总线字长20bit,总线上有三种字:命令字,数据字,状态字 命令字的组成如下: 1.同步头:3bit 1.5个高电平,1.5个低电平 2.RT地址:5bit 3.收发标识:1bit 4.子地址:5bit 5.命令数据...
  • 点击打开链接
  • 【博文汇总】SPI总线学习

    万次阅读 多人点赞 2011-11-07 08:11:08
    【SPI总线协议介绍】  简要的介绍了SPI协议的技术性能、总线结构、接口定义、物理内部结构、时钟极性和时钟相位、传输时序、数据传输以及优缺点。通过该文章能多SPI协议有一个基本的了解。 【关于I2C和SPI总线...
  • I2C协议

    万次阅读 多人点赞 2018-11-01 19:50:16
    [I2C]I2C总线协议图解 转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构    I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。...
  • CAN总线基础知识(一)

    万次阅读 多人点赞 2014-03-13 14:49:29
    1.CAN总线是什么?  CAN(Controller Area Network)是ISO国际标准化的串行通信协议。广泛应用于汽车、船舶等。具有已经被大家认可的高性能和可靠性。  CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来...
  • 【博文汇总】I2C总线学习

    千次阅读 多人点赞 2011-11-01 00:51:32
    关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序
  • 1553B数据总线

    万次阅读 2015-11-01 09:59:32
    1553B数据总线 一、协议介绍 ①MIL-STD-1553B数据总线全称是“飞机内部分时制指令/响应多路传输数据总线”,是在1973年公布的MIL-STD-1553总线基础上修订的。MIL-STD-1553B是1978年9月公布的。 二、终端定义及...
  • LIN总线(一)

    千次阅读 2017-07-26 00:05:30
    因此LIN总线在BCM车身网络中经常用于控制一些开关、车窗、车门、后视镜等。如下图所示 LIN的最新协议标准ISO17987 LIN的接口有两部分组成:SCI协议控制器、LIN驱动器。 LIN的一些...
1 2 3 4 5 ... 20
收藏数 83,187
精华内容 33,274
关键字:

总线协议