精华内容
下载资源
问答
  • 总线接口可以工作在 4 种模式下 :Master 发送模式 , Master 接收模式 , Slave 发送模式 , Slave 接收模式 . 当 IIC 总线空闲时 ,SDA 和 SCL 线都保持高电平 ; 在 SCL 保持高电平情况下 ,SDA 从高电平跳变到低...

     

     

    <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

    s3c2410支持multi-master IIC总线串行接口;通过SDA(serial data line)SCL(serial clock line)两个单行线(bi-direction),在总线的Master(主设备)Slave(从设备)间进行数据读写操作;以下寄存器时IIC操作必须配置的:

    IICCON:控制寄存器

    IICSTAT:控制和状态寄存器

    IICDS:Tx/Rx数据移位寄存器

    IICADD:地址寄存器

    IIC总线接口: S3c2410 IIC 总线接口可以工作在4种模式下:Master发送模式, Master接收模式, Slave发送模式, Slave接收模式.

    IIC总线空闲时,SDASCL线都保持高电平; SCL保持高电平情况下,SDA从高电平跳变到低电平启动一个"开始"信号,表示传输开始; SCL保持高电平情况下, SDA从低电平跳变到高电平跳变启动一个"结束"信号,表示传输结束;"开始""结束"信号都有Maser设备产生.主设备在产生"开始"信号发送第一个字节,该第一字节为:bit0~bit6表示要与其通讯的Slave的地址,bit7代表读写("0"表示读,"1"表示写);总线上传输的数据都以字节为单位,传输时都是首先传输MSB(most-significant bit),并在每个字节传输完毕后接收接收方发送的ACK bit;

     “开始结束条件:IIC总线不可用情况下, s3c2410处于Slave; 也就是说, 接口在发现开始条件前,其是处于Slave模式的.当接口转换到Master模式后, 既可以在SCL产生时钟信号并在SDA线上传输数据.

     

    数据传输格式:SDA上的数据传输以8bit为单位;在一次传输过程中可传输的字节数是不受限制的;但是每次传输过程都是:1)主设备在开始信号后发送从设备地址.2)接收方在收到数据后发送ACK bit;具体格式如下:

     

    展开全文
  • usb转IIC接口程序

    2013-11-04 15:30:36
    usb转IIC接口上位机程序,可方便通过电脑用此软件和从机对接看数据。
  • 嵌入式IIC接口

    2019-05-21 16:38:26
    这里是为了存着自己用 如有需要pxa270芯片手册查找IIC以及中断相关寄存器则自行查找芯片手册

    串行12C总线具有双引脚接口。串行数据和地址(SDA)数据3脚用于I/O功能,串行时钟线(SCL)时钟引脚控制和引用I2C总线。I2C接口允许PXA27x处理器作为I2C总线上的主从设备。
    I2C接口使PXA27x处理器能够与I2C外围设备和微控制器进行系统管理功能的通信。I2C总线需要最少的硬件中继状态、可靠性和设备之间的控制信息,I2C接口作为外围设备驻留在处理器内部总线上。缓冲接口提供对通过I2C总线发送和接收的数据的访问。一组内存增强寄存器、中继控制和状态信息。
    注意: I2C接口不支持硬件通用调用、10位寻址、高速模式(HS-模式,3.4Mbit/s)或CBUS兼容性。

    例如,处理器I2C接口可以在总线上充当主机,将EEPROM作为接收数据的从站(参下图)。当12C接口寻址EEPROM时,它充当主发射机,EEPROM作为从接收器。当I2C接口读取数据时,它充当主接收器,EEPROM作为从发送器。无论是作为发射机还是接收器,主服务器都生成时钟,启动事务并终止事务。
    在这里插入图片描述
    I2C总线使用开路的有线和结构,它允许多个设备驱动TheBus线路,并就仲裁、等待状态和错误条件等事件进行状态通信。当主服务器在数据传输期间驱动时钟(SCL)行时,它会在时钟较高的每个实例上传输一点。当从站无法接受或驱动由主程序分配的数据时,从站可以在高状态之间保持较低的SCL,以插入等待间隔。主时钟只能在仲裁期间由另一个主站改变,或者由保持时钟线低的慢从属器来改变。
    I2C总线允许多个主机,这意味着多个设备可以同时启动数据传输。总线仲裁解决了主程序之间的冲突。如果两位主人驾驶着相同的数据,他们就会同时在公共汽车上做烛光。如果主程序试图将SDA推高,而另一位主程序将SDA降低,则主程序将输掉仲裁。SCL线是由主程序使用有线和连接到SCL线生成的时钟的同步组合。
    I2C事务由I2C接口作为主程序发起,或者由I2C接口作为从级接收。这两种情况都可能导致读、写或在I2C总线上同时进行。
    操作块
    I2C单元驻留在处理器外围总线上。处理器中断机制可用于通知CPU在I2C总线上存在活动。可以使用轮询代替中断。I2C接口包括到I2C总线的双线接口、用于往返PXA27x处理器的数据的八位缓冲区、一组控制和状态寄存器以及用于并行/串行转换的移位寄存器(见下图)。I2C总线接口单元图
    在这里插入图片描述
    在以下情况,I2C接口启动对PXA27x处理器的中断:
    (1) 缓冲器满了
    (2) 缓冲区为空
    (3) 检测到I2C接口从地址
    (4) 仲裁失败
    (5) 出现总线错误情况

    当PXA27x处理器在I2C总线上启动读或写时,它会将接口从默认的从接收模式切换到主传输模式。如果事务是写的,则在地址传输完成后,I2C接口仍然处于主传输模式。如果事务是读的,则I2C接口发送从地址,然后切换到主接收模式。

    I2C启动和停止
    在这里插入图片描述
    I2C单元使用ICR[START]和ICR[STOP]位来:启动额外的字节传输,在I2C总线上启动一个启动条件,启动数据连接(重复启动),在I2C总线上启动停止条件
    在这里插入图片描述
    在这里插入图片描述
    Start
    启动条件(icr[start]=1, icr[stop]=0)启动主事务或重复启动。在设置ICR[Start]之前,软件必须在IDBR中加载目标从地址和R/nW位(参见9.5.4节)。在设置ICR[TB]后, 在I2C总线上传输起始和IDBR内容。对于写入请求,I2C总线停留在主传输模式,对于读取请求则进入主接收模式。对于重复启动、读或写的更改或目标从地址的变化,IDBR包含更新的目标从地址和ther/nw位。重复的启动使主人能够在不放弃总线的情况下多次转移到不同的奴隶
    No START or STOP Condition
    在主传输模式中使无开始或停止条件 (icr[start]=0, icr[stop]=0), 而I2C接口正在传输多个数据字节(见图9-4)。软件写数据字节,I2C接口设置ISR[ITE]并清除ICR[TB]。然后,软件将一个新字节写入IDBR并设置ICR[TB],以启动新的字节传输。这个过程一直持续到软件设置ICR[开始]或ICR[停止]为止。ICR[Start]和ICR[Stop]在发送开始、停止或重复START后,I2C接口不会自动清除。
    在每个字节传输之后,包括ICR[ACKNAK]控制位定义的确认脉冲之后,I2C接口将SCL线保持在较低的位置,以插入等待状态,直到设置了ICR[TB]。此操作通知I2C接口释放SCI行, 并允许下一次信息传输继续进行。
    STOP condition

    在这里插入图片描述在这里插入图片描述

    9.4.4数据传输序列
    I2C单元以1字节增量传输数据,并始终遵循以下顺序:
    1、 START启动
    2、 7位从地址
    3、 R/nW位
    4、 确认脉冲
    5、 8位数据
    6、 确认脉冲
    7、 对所需字节数重复步骤5和步骤6
    8、 重复启动(重复步骤1)或停止
    9.4.5数据和地址管理
    I2C数据缓存寄存器(IDBR)和I2C从地址寄存器(ISAR)管理数据和从地址。IDBR(参 见9.5.4节)包含-个字节的数据或一.个7位的从地址和R/NW位。ISAR包含处理器的可编程从地址。I2C接口在接收和确认完整字节后将接收到的数据放入IDBR。为了传输数据,CPU写入IDBR, I2C接口在设置ICR[TB]时将信息传递给串行总线。见9.5.1节。
    当I2C接口处于主或从传输模式时:
    1、 软件通过内部总线将数据写入IDBR,内部总线启动主事务或在设置ISR[ITE]后发送下一个数据字节。
    2、 I2C接口在设置ICR[TB]时从IDBR传输数据
    3、 启用时,当一个字节在I2C总线上传输,并且应答周期完成时,IDBR发送空中断就会被发出信号。
    4、 当I2C接口准备在CPU编写IDBR之前传输下一个字节,并且停止条件不到位时,I2C接口插入等待状态,直到CPU向IDBR写入新值并设置ICR[TB]。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    以下是自己答辩嵌入式IIC实验时准备的每个寄存器相对应位的作用,这里是为了存着自己用在这里插入图片描述
    如有需要pxa270芯片手册查找IIC以及中断相关寄存器则自行查找芯片手册

    展开全文
  • 本文主要介绍zynq 7000下的i2c ps 外设编程。实验是在vivado 2018.3 上完成的。 本实验的前提条件是你已经做过了zynq 7000的helloworld sdk 实验。一般开发板的厂家都提供了的,一些设置与所用硬件有关,也可参考我...

    本文主要介绍zynq 7000下的i2c ps 外设编程。实验是在vivado 2018.3 上完成的。

    本实验的前提条件是你已经做过了zynq 7000的helloworld sdk 实验。一般开发板的厂家都提供了的,一些设置与所用硬件有关,也可参考我的博客 petalinux 2018.2 下的helloworld 实验

    I2C总线简介

    I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。I2C总线上分成主机和从机两种设备。

         主机用于启动总线传送数据并产生时钟以同步从机,此时任何被寻址的器件均被认为是从器件.在总线上主机和从机、发送和接收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

    SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出,需通过上拉电阻接电源VCC。当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。

    zynq 7000的I2C

    在zynq 7000中有2种方式可以控制iic(I2C)外设,一种是利用zynq 7000的 PS 外设i2c ,还有一种是axi4-i2c IP。 我认为前面简单一点,所以采用的前面那种方式。

    在vivao 里打开以前设计的helloworld 工程,或者其他工程,没有就先做一个,打开原理图设计(open block design),双击zynq 打开zynq设置。

    在设置界面里,选择peripheral I/OPins,在I2C0 行里,列里 EMIO。我之所以这样选是:我的开发板里没有直接的MIO 可选,只能选扩展输出口的引脚。也许你的情况不一样,那就不一样的选择。 

    其实这样选择就可以了,但我还是到MIO Configuration 查看下,这里有I2C0 对应EMIO

     

    这样修改设置后回到原理图。这时可以看到zynq 多了IIC0,接下来将鼠标箭头移动到接口上,当看到箭头变为铅笔形状是点击鼠标右键,在弹出的菜单中选择 Make External 将接口修改为外部接口,可以看到外部接口名为IIC_0

    保存原理图, 依次进行Generate Output Products和 Create HDL Warpper操作。就是在source 中选择.bd文件,右键出现菜单,选择他们。

    在约束文件中添加如下内容,引脚的名字可以在***wrapper.v文件中看到。

    set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_scl_io]
    set_property PACKAGE_PIN G17 [get_ports IIC_0_scl_io]
    set_property IOSTANDARD LVCMOS33 [get_ports IIC_0_sda_io]
    set_property PACKAGE_PIN C20 [get_ports IIC_0_sda_io]
    
    set_property PULLUP true [get_ports IIC_0_scl_io]
    set_property PULLUP true [get_ports IIC_0_sda_io]

    约束文件其实也可交互式添加。点击左侧导航栏 RTL ANALYSIS->Open Elaborated Design,在弹出的对话框中点击“ OK” 打开电气设计窗口。在打开的窗口内点击箭头所指的 I/O Ports,会在下面打开配置引脚约束的窗口。在窗口里找到IIC 相关引脚并设置。我是这样得到上面脚本的。

    在这里C20 G17 是引脚编号,我就是在输出扩展口中选2个脚,然后对应连接外设的相应引脚。

    设计做好了,下面就是产生比特流,输出硬件(应该包含比特流)

    SDK软件设计

    在Vivado 里, File->Launch SDK。我们进入SDK 软件设计。

    在SDK 里, 新建一个工程,选择模板为hello world , 可以运行下helloworld,看看显示等是否一切正常。

    删除helloworld.c 里的所有内容, 然后复制如下代码:

    #include <stdio.h>
    #include "platform.h"
    #include "xil_printf.h"
    #include "xparameters.h"
    #include "xiicps.h"
    // IIC device ID
    #define IIC_DEV_ID 			XPAR_PS7_I2C_0_DEVICE_ID
    #define IIC_RATE 			200000
    //7位设备地址
    #define SLAVE_ADDR			0x40
    
    #define MODE1	0
    #define PRESCALE	254
    
    static 	XIicPs IicPs;
    static 	XIicPs_Config * IicPs_Cfg;
    
    //测试配置列表
    u8 configList[11][2]={
    		{0x00,0x10},
    		{0xfe,120},
    		{0x00,0x00},
    		{6,0x0},
    		{7,0x0},
    		{8,200},
    		{9,0},
    		{0x0A,0},
    		{0x0B,0},
    		{0x0c,150},
    		{0x0d,1}
    };
    
    // 初始化IIC,并设置IIC速率
    int initIic()
    {
    	int status;
    	// 1.查找IIC设备
    	IicPs_Cfg = XIicPs_LookupConfig(IIC_DEV_ID);
    	// 2.初始化
    	status = XIicPs_CfgInitialize(&IicPs, IicPs_Cfg, IicPs_Cfg->BaseAddress);
    	if(status != XST_SUCCESS)
    	{
    		print("initial IIC failed \n");
    		return XST_FAILURE;
    	}
    	//设置IIC速率
    	status = XIicPs_SetSClk(&IicPs, IIC_RATE);
    	if(status != XST_SUCCESS)
    	{
    		print("set IIC clock rate failed \n");
    		return XST_FAILURE;
    	}
    	return XST_SUCCESS;
    }
    
    /******************************************************************
     * function IIC完成单个寄存器的配置
     *
     * @parameter : XIicPs * iicPs =====> IIC设备结构体
     * @parameter : u16 slaveAddr  =====> IIC从机设备地址
     * @parameter : u8 * Cfg_Ptr ====> 配置寄存器的指针
     *
     * @return s32 XST_SUCCESS or XST_FAILURE
     ******************************************************************/
    s32 writeReg(XIicPs * iicPs, u16 slaveAddr, u8 * Cfg_Ptr)
    {
    	s32 status ;
    	//IIC写入数据,从机地址,寄存器地址和写入的数据
    	status = XIicPs_MasterSendPolled(iicPs, Cfg_Ptr, 2, SLAVE_ADDR );
    	if (status != XST_SUCCESS)
    	{
    		printf("configure register failed! \n");
    		return XST_FAILURE;
    	}
    	//两次IIC写入之间保持一定间隔
    	usleep(8000);
    	return status;
    }
    /******************************************************************
     * function IIC从寄存器中读出数据
     *
     * @parameter : XIicPs * iicPs =====> IIC设备结构体
     * @parameter : u16 slaveAddr  =====> IIC从机设备地址
     * @parameter : u8 * Cfg_Ptr ====> 配置寄存器的指针
     *
     * @return u8 registerData =====> 从寄存器中读出的数据
     ******************************************************************/
    u8 readReg(XIicPs * iicPs, u16 slaveAddr, u8 * regAddr)
    {
    	s32 status ;
    	u8 registerData;
    	//发送设备地址,寄存器地址
    	status = XIicPs_MasterSendPolled(iicPs, regAddr, 1, SLAVE_ADDR );
    	if (status != XST_SUCCESS)
    	{
    		printf("configure register failed! \n");
    		return XST_FAILURE;
    	}
    	//从寄存器中读出数据
    	status = XIicPs_MasterRecvPolled(iicPs, &registerData, 1, SLAVE_ADDR);
    	if (status != XST_SUCCESS)
    	{
    		printf("configure register failed! \n");
    		return XST_FAILURE;
    	}
    	return registerData;
    }
    
    int main()
    {
        init_platform();
        u8 dataBuf[31];
        u8 addr,obj;
        //初始化IIC
        int status = initIic();
        if(status != XST_SUCCESS)
        {
        	printf("initialize IIC failed \n");
        	return XST_FAILURE;
        }
        print("Hello World1\n\r");
        //依次写入配置列表
        for(int i=0; i < 11; i++ )
        {
        	writeReg(&IicPs, SLAVE_ADDR, configList[i]);
        	addr=configList[i][0];
        	obj=readReg(&IicPs, SLAVE_ADDR, &addr);
        	printf("i=%d, addr=%x, obj=%x\n",i,addr,obj);
        }
        //将值从寄存器中读出
        print("Hello World2\n\r");
    
        cleanup_platform();
        return 0;
    }
    

    我这代码来自 ZYNQ基础----驱动IIC外设 ,然后对他进行了修改。
    其实sdk 本身也有代码,并且还有编程说明,打开bsp 下的 system.mss,可以看到ps7_i2c_0  这里有document,还可以Import Examples。

    在Import Examples 里可以找到例子存放的目录。就是点击 Examples Directory。

    我开始测试了xiicps_polled_master_example.c,但是不成功,还是我上面例子比较好。

     软件运行测试

    排除软件错误,复制应该编译问题。

    Xilinx->Program FPGA

    然后就可以用 Debug As或者Run As 测试软件了。

    要测试软件,有一些需要注意。

    1:正确连接i2c 设备。定义为SCL 的脚连设备的SCL脚, SDA也是对应连接,还有GND VCC。

    2:确定好I2C 设备的地址,我的是0x40 

    #define SLAVE_ADDR            0x40

    你的不同就要修改这里,如果地址不对,就不会有响应。

    3:明白I2C 寄存器地址的含义,并不是所有寄存器都是内存一样,读写含义可能不同。我测试的是PCA9685 舵机控制器。

    //测试配置列表
    u8 configList[11][2]={
            {0x00,0x10},
            {0xfe,120},
            {0x00,0x00},
            {6,0x0},
            {7,0x0},
            {8,200},
            {9,0},
            {0x0A,0},
            {0x0B,0},
            {0x0c,150},
            {0x0d,1}
    };

    configList 里面的内容是(前面寄存器地址,后面写入字节) 这样一个表。你可以改变表的长度和内容,适应你设备的情况。

    程序运行结果:

    Hello World1
    i=0, addr=0, obj=90
    i=1, addr=fe, obj=78
    i=2, addr=0, obj=80
    i=3, addr=6, obj=0
    i=4, addr=7, obj=0
    i=5, addr=8, obj=c8
    i=6, addr=9, obj=0
    i=7, addr=a, obj=0
    i=8, addr=b, obj=0
    i=9, addr=c, obj=96
    i=10, addr=d, obj=1
    Hello World2

    当然显示只是一方面,还要看I2C 运行功能状态。我上面代码可以控制舵机正常工作。

    介绍到此!

    展开全文
  • IIC接口EEPROM的控制

    2011-04-18 14:31:50
    AT24Cxx是Atmel公司生产的串行电可擦的可编程存储器EEPROM,它采用8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在I2C总线上并接4片该芯片,特别适用于具有大容量数据存储要求的数据采集系统。...
  • 0.94寸OLED12864测试程序C51,iic接口,显示简单生产测试画面,生产自用。检测有无显示缺画,对不度是否正常
  • 51单片机IIC总线编程

    千次阅读 2012-11-23 23:40:37
    #include #define uchar unsigned char ...//用单片机的两个I/O口模拟I2C接口 uchar a; *************************************************************************** void delay()//简单延时函数 { ;; }
    #include<reg52.h>
    #define uchar unsigned char
    sbit sda=P2^0;
    sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接口
    uchar a;
    ***************************************************************************
    void delay()//简单延时函数
    { ;; }
    ***************************************************************************
    void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
    {	
    	sda=1; //释放SDA总线
    	delay();
    	scl=1;
    	delay();
    	sda=0;
    	delay();
    }
    ***************************************************************************
    void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
    {
    	sda=0;
    	delay();
    	scl=1;
    	delay();
    	sda=1;
    	delay();
    }***************************************************************************
    void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
    {
    	uchar i;
    	scl=1;
    	delay();
    	while((sda==1)&&(i<250))i++;
    	scl=0;
    	delay();
    }
    ***************************************************************************
    void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号
    {
    	sda=1;
    	delay();
    	scl=1;
    	delay();
    }
    ***************************************************************************
    void write_byte(uchar date) //写一个字节
    {
    	uchar i,temp;
    	temp=date;
    
    
    	for(i=0;i<8;i++)
    	{
    		temp=temp<<1;
    		scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿
    	    delay();
    		sda=CY;
    		delay();
    		scl=1;//拉高SCL,此时SDA上的数据稳定
    		delay();
    	}
    	scl=0;//拉低SCL,为下次数据传输做好准备
    	delay();
    	sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
    	delay();
    }
    ***************************************************************************
    uchar read_byte()//读一个字节
    {
    	uchar i,k;
    	scl=0;
    	delay();
    	sda=1;
    	delay();
    	for(i=0;i<8;i++)
    	{
    		scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦
    		delay();	
    		k=(k<<1)|sda;
    		scl=0;//拉低SCL,使发送端可以把数据放在SDA上
    		delay();	
    	}
    	return k;
    }
    ***************************************************************************
    void write_add(uchar address,uchar date)//任意地址写一个字节
    {
    	start();//启动
    	write_byte(0xa0);//发送从设备地址
    	respons();//等待从设备的响应
    	write_byte(address);//发出芯片内地址
    	respons();//等待从设备的响应
    	write_byte(date);//发送数据
    	respons();//等待从设备的响应
    	stop();//停止
    }
    ***************************************************************************
    uchar read_add(uchar address)//读取一个自己
    {
    	uchar date;
    	start();//启动
    	write_byte(0xa0);//发送发送从设备地址 写操作
    	respons();//等待从设备的响应
    	write_byte(address);//发送芯片内地址
    	respons();//等待从设备的响应
    	start();//启动
    	write_byte(0xa1);//发送发送从设备地址 读操作
    	respons();//等待从设备的响应
    	date=read_byte();//获取数据
    	stop();//停止
    	return date;//返回数据
    }

    展开全文
  • 最近在使用红外测温传感器,IIC通信,在单片机上已能读取数据,但是想把数据读取到电脑上用python做一些处理,想到树莓派自带IIC接口,于是尝试直接将红外传感器接到树莓派的IIC管脚。 启用树莓派I2C功能: 参考...
  • 运行结果 • 使用之前烧录程序,选择生成的hex文件: • 之后确保开发板连接电脑即可开始编程。 此处若不行需重启开发板,再按reset键 • 结果如下: 二、OLED滑动显示字符 1.生成字模 • 打开之前的字模软件,输入...
  • IMx283开发板,特殊硬件接口编程。包括SPI, IIC等接口。
  • IIC_Init(); AHT20.alive=!AHT20_Init(); OLED_Init(); OLED_Clear(0); while(1) { show_my_num(); show_my_name(); if(AHT20.alive) { AHT20.flag = AHT20_ReadHT(AHT20.HT); c1 ...
  • IIC器件是一种介于高速和低速之间的嵌入式外围设备,其实总体来说,它的速度算是比较慢的。通常情况下,速度慢的器件意味着更多的等待,这对于精益求精的嵌入式工程师来说,简直就是一个恶梦,低速器件的存取数据...
  • IIC 协议与编程序列

    2021-07-25 15:05:31
    I2C 属于串行通信协议,供双线接口用于连接 EEPROM、传感器、RTC、ADC/DAC 等低速器件以及嵌入式系统中的其它兼容 I/O 接口。 在本文中,您将了解有关内部集成电路总线(I2C 或 IIC)的基础知识以及将此协议总线...
  • IIC 总线接口详细介绍

    万次阅读 多人点赞 2018-10-10 20:03:17
    IIC = Inter Integrated-Circuit 总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线,它支持多主控(multimastering),其中任何能够进行发送和接收的...
  • 摘要:介绍了采用ALTERA公司的可编程器件EPF10K10LC84-3实现IIC总线的通讯接口的基本原理,并给出了部分的VHDL语言描述。该通讯接口与专用的接口芯片相比,具有使用灵活、系统配置方便的特点。 关键词:IIC总线...
  • IIC总线原理和编程

    2021-03-03 20:29:32
    IIC数据传输速率 标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps), 另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps) IIC通信方式 IIC通信方式为半双工,只有一根SDA线,同一时间只...
  • 接口技术 -- IIC

    千次阅读 2019-09-21 12:31:18
    IIC1 概念2 传输过程3 数据规范3.1 数据有效3.2 起始停止条件(由主机控制)3.3 位规范3.4 同步与仲裁(此概念重要)3.4.1 同步3.4.2 仲裁4 协议时序规范(编程所需重点)4.1 写时序4.2 读时序5 其它 1 概念 IIC(Inter-...
  • IIC

    2016-12-14 10:46:02
    IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线。 IIC总线只有两根双向信号线。一根是数据线SDA,一根是时钟线SCL。 连接到相同总线的IC数量,...
  • 声明:在翻译本文之前并没有去查找相关的翻译文献,只是认为这样可以...IIC总线接口 概述:  S3C2440ARISC微处理器支持多主IIC总线串行接口。一条专用的串行数据线(SDA)和一个串行时钟线(SCL)携带总线主机和...
  • 摘要:介绍了采用ALTERA公司的可编程器件EPF10K10LC84-3实现IIC总线的通讯接口的基本原理,并给出了部分的VHDL语言描述。该通讯接口与专用的接口芯片相比,具有使用灵活、系统配置方便的特点。  关键词:IIC总线 ...
  • 单片机 MSP430 IIC控制器编程(1)

    千次阅读 2015-11-21 10:02:17
    近日在开发开发微型投影仪的单片机程序,主要是用单片机控制DLP芯片组进行相应的初始化和参数设置,所有芯片的通信接口都是用IIC。 在此记录下,IIC的开发过程。 1.初始化 17.3.1 USCI 初始化和复位 USCI由一个 ...
  • ARM学习笔记--IIC总线接口

    千次阅读 2013-03-08 21:36:30
    一、IIC总线协议和硬件介绍 1、IIC总线协议 1)IIC总线的概念  IIC总线是一种串行总线,用于连接微控制器及其外围设备,具有以下特点:  ①两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)  ②...
  • 单片机 MSP430 模拟IIC编程(2)

    千次阅读 2015-11-21 10:21:20
    而要减少代码量,简化接口控制,最直接方法就是减少有关寄存器操作次数。要实现这一想法需要软硬件结合,充分利用I/O口特点以及I2C总线协议特点。  仔细观察图3基本数据操作时序[1]可以发现:第一,I2C...
  • 有很多便宜的基于ch341a的SPI/IIC编程器,低至3美元就可以在ebay上买到。 然而,没有与硬件相关的基于 Linux 的工具,我能找到的最好的工具是一个名为“ch341eepromtool”() 的工具,它只能处理 IIC EEPROM。 所以我...
  • IIC的基本介绍 IIC的简介 IIC(Inter-Integrated Circuit...由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10...
  • 第一部分:通信接口 SDA信号和SCL信号由此产生或输入 第二部分:时钟部分 时钟信号由此产生或由此读取 第三部分:数据部分 通信时,数据从缓冲区放入DR寄存器,再由SR寄存器将其一位一位移出到SDA发送。这个过程持续...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,411
精华内容 1,364
关键字:

iic接口编程