4. 基于SCB模块的I2C串行通信实现 本文引用地址:http://www.**/article/264012.htm ① I2C串行通信简介 I2C(Inter Integrated Circuit)是一种两线制的串行通信协议,被广泛应用于嵌入式设备中芯片之间的低速互连通路,如单片机,ADC,DAC,EEPROM,温度传感器, 电源检测器等,与UART只能实现点到点通信模式不同,I2C总线可以方便的构成多机系统和外围器件扩展系统,器件地址采用硬件设置方法,并通过软件进行寻址。图6给出了I2C总线拓扑示意图。 图6:I2C总线拓扑示意图 由图2可以看出,I2C总线共有两根信号线,SDA串行数据线与SCL串行时钟线。SCL保证了总线上所有器件的时钟同步,可实现较快的传输速率(标准模式为100Kbps,高速模式可达3.4Mbps)。I2C总线可以同时连接多个节点设备,并支持多主从设备模式,但同一时刻只能由一个主设备,负责产生SCL同步时钟和发起与结束一次数据传输。且主设备和从设备均可作为发送器(写数据)和接收器(读数据)。 由于只有一根SDA数据线,因此I2C总线只能实现半双工传输模式。数据的读/写均由主设备发起与结束。以读数据为例,首先主设备发起数据传输,输出START事件并输出7bit的从设备地址和读标志’1’;接下来主设备释放SDA,被寻址的从设备拉低SDA作为对主设备的应答(ACK)。然后从设备将通过SDA向主设备发送8位数据,主设备接收完成后发送应答(ACK)信号。当主设备读完所有的数据,输出STOP事件,结束本次传输。过程示意如图7所示。 图7:I2C总线主设备读数据示意 当总线上多个主设备在同一时刻发起数据传输时,冲突检测和仲裁机制能够保证数据不被丢失。当主设备侦测到SDA 上的逻辑值与自身驱动的值不符时,则检测到总线冲突,并放弃对总线的控制。更多I2C 协议的知识请参考官方的I2C 协议标准。 ② 基于SCB的I2C通信实现 在图2所示的配置框中,将SCB配置为I2C模式,点开出现的” I2C”菜单,配置基本的I2C通信参数,如图8所示;需要注意的是,当配置为Master模式的时候,不需要设置地址,只有在配置为Slave模式时,才需要7位地址。 I2C只能支持半双工通信,因此在同一时刻,数据发送和接收模式只能选择一种。与UART相似,数据的发送和接收都可以用中断与轮询两种方式来完成。 PSoC Creator 3.0 本身带有I2C半双工数据处理的Example Project;点击菜单File->Example Project,选择PSoC 4 Architecture,然后选择”SCB_I2cCommMaster”(主设备模式)或”SCB_I2cCommSlave”(从设备模式)即可打开I2C通信例程。本文以”SCB_I2cCommMaster”为例,打开后的原理图界面如图9所示。 图 8:I2C通信参数配置 本例程中的主设备通过I2C总线发送0,1,2,3四个数字给下位机来控制RGB三色LED灯的循环点亮。 图 9: SCB_I2cCommMaster 发送数据的函数代码如下: uint32 WriteCommandPacket(uint8 cmd) { uint8 buffer[BUFFER_SIZE]; uint32 status = TRANSFER_ERROR; /* Initialize buffer with packet */ buffer[PACKET_SOP_POS] = PACKET_SOP; buffer[PACKET_CMD_POS] = cmd; buffer[PACKET_EOP_POS] = PACKET_EOP; (void) I2CM_I2CMasterWriteBuf(I2C_SLAVE_ADDR, buffer, PACKET_SIZE, I2CM_I2C_MODE_COMPLETE_XFER); while (0u == (I2CM_I2CMasterStatus() & I2CM_I2C_MSTAT_WR_CMPLT)) { /* Waits until master completes write transfer */ } /* Displays transfer status */ if (0u == (I2CM_I2C_MSTAT_ERR_XFER & I2CM_I2CMasterStatus())) { RGB_LED_ON_GREEN; /* Check if all bytes was written */ if(I2CM_I2CMasterGetWriteBufSize() == BUFFER_SIZE) { status = TRANSFER_CMPLT; } } else { RGB_LED_ON_RED; } (void) I2CM_I2CMasterClearStatus(); return (status); } 函数发送三个字节长度的buffer数组给从设备,第一个字节为起始符字节”PACKET_SOP”,第二个字节为数据字节”cmd”, 第三个字节为结束符字节”PACKET_EOP”。数据的发送通过函数” I2CM_I2CMasterWriteBuf”来执行,它寻址从设备并自动将数据加载到总线上。接下来是不断轮询数据发送的状态,直到成功发送完成。接收数据的过程与此类似,您可参考本例程中的数据读取函数。 5. 基于SCB模块的SPI串行通信实现 ① SPI串行通信简介 SPI(Serial Peripheral Interface:串行外设接口)总线是Motorola公司 推出的 一种同步串行接口技术。SPI总线允许MCU以全双工的同步串行方式,与各种外围设备进行高速数据通信。主要应用在EEPROM,Flash,RTC(实时时钟),ADC,DSP以及数字信号解码器之间。 SPI数据传输共有四根信号线:SCLK为串行时钟信号,由主设备产生,并传输到从设备作为同步时钟;MOSI/SIMO为主出从入数据信号,由主设备输出,输入到从设备。MISO/SOMI为主入从出信号,由从设备输出,输入到主设备。SELECTx为从设备选择信号,由主设备输出,输入到从设备,一般为低电平有效。 SPI总线拥有最高的传输速率,最低标准速率为500Kbps,最高可达8Mbps,且为全双工模式,因此特别适合于MCU用来读写诸如EEPROM等片外设备中的数据。 图10给出了一主三从的SPI总线串行通信系统框图。SPI总线一般为”一主多从”拓扑结构,进行数据传输时,主设备首先控制相应的一根SELECTx来选择从设备,然后主设备向从设备同时传输时钟(通过SCLK)和数据(通过MOSI/SIMO),从设备对该数据进行采样;如果主设备需要读数据时,从设备将数据发送到MISO/SOMI线上,主设备对该数据进行采样。 图10:SPI总线串行通信系统框图 在连续传输多帧数据时,SELECT 信号一直被拉低。从设备就无法利用SELECT 的状态来区分每一帧,从而需要一直监测数据,根据主从设备之间约定的协议找出帧头和帧尾。当总线结束数据传输时,SELECT 被重新拉高,SCLK 无时钟输出。摩托罗拉定义了SPI 协议中的四种信号传输模式,规定数据在哪个时钟沿被发送和采样。通过配置时钟极性(CPOL: Clock POLarity)和时钟相位(CPHA: Clock PHAse)来选择四种模式中的一种。图11给出了传输模式0(SCLK 空闲态为低,时钟上升沿采样数据,时钟下降沿发送数据) 下,双帧(16bit)数据传输的波形图。 图11:传输模式0 下的双帧数据传输波形图 除了Motorola公司提出的初始版本SPI协议外,TI(德州仪器)与NSC(国家半导体)也在其基础上提出了各自的修改版SPI协议。关于SPI协议的详细信息,您可以参考相关的理论文献。
|