精华内容
下载资源
问答
  • IIC寄存器的配置

    2015-04-15 17:07:07
    IIC寄存器的配置,read,write
  • SHT20 IIC 寄存器概述

    2018-08-28 16:13:00
    1、寄存器列表 名称 指令(bin) 寄存器内容(hex) 主机模式(Trigger T measurement hold master) 1110’0011 0xe3 主机模式(Trigger RH measurement hold master) 1110’0101 0xe4 从机模式(Trigger ...
    ** 注:部分内容来自SHT20芯片手册翻译 **
    1、寄存器列表
    名称指令(bin)寄存器内容(hex)
    主机模式(Trigger T measurement hold master)1110’00110xe3
    主机模式(Trigger RH measurement hold master)1110’01010xe4
    从机模式(Trigger T measurement no hold master)1111’00110xf3
    从机模式(Trigger RH measurement no hold master)1111’01010xf4
    写入用户寄存器(Write user register)1110’01100xe6
    读取用户寄存器(Read user register)1110’01110xe7
    软复位(Soft reset)1111’11100xfe
    2、User register

    User 寄存器内容如下图所示,需要注意的是 保留位(Reserver)不允许被改变。但是默认值可能会不一样, 所以,我们在配置User寄存器的时候,必须要先读取一遍User 寄存器.

    img1.png?&inline=true

    如下图所示,是一个读写 User Register的example。

    img2.png?&inline=true

    上图中白色块由MCU发出,灰色块由 Sensor 发出。, 该流程设置的分辨率为RH8bit,T12bit。
    参考代码如下图所示:

    /*
    * function : set resolution
    * paragram : res [RH12_T14],[RH8_T12],[RH10_T13],[RH11_T11]
    * return   : null
    * by zhangpeng
    */
    void SHT20_SetResolution(uint8_t res)
    {
        IIC_Start();//S
        IIC_SendByte(IIC_WRITE_ADDR);//I2C Addr + Write
        IIC_SendByte(REG_READ_USER);//Read Register
        IIC_Start();//S
        IIC_SendByte(IIC_READ_ADDR);//I2C Addr + Read
        Register = IIC_RecvByte();//Read Register content
        IIC_NOACK();//NoAck
        IIC_Start();//S
        IIC_SendByte(IIC_WRITE_ADDR);//I2C Addr + Write
        IIC_SendByte(REG_WRITE_USER);//Write Register
        //修改bit7
        if ((res == RH12_T14)||(RH8_T12 ==res))
        {
            Register = Register & 0x7F;
        }
        else
        {
            Register = Register | 0x80;
        }
        //修改bit0
        if ((res == RH12_T14)||(RH10_T13 ==res))
        {
            Register = Register & 0xFE;
        }
        else
        {
            Register = Register | 0x01;
        }
        IIC_SendByte(Register);//Register content
        IIC_Stop();//P
    }
    3、Soft Reset

    Soft Reset 被用作软复位Sensor,当读取的数据出现错误的时候,可以通过发送 SoftReset 进行软重启。如下图所示:

    img3.png?&inline=true

    参考代码:

    /*
    * function : soft reset SHT20
    * paragram : null
    * return   : null
    */  
    void SHT20_SoftReset()
    {
        IIC_Start();//S
        IIC_SendByte(IIC_WRITE_ADDR);//I2C Addr + Write
        IIC_SendByte(REG_RESET); //Soft Reset
        // todo :delay 10us
    }
    展开全文
  • stm32模拟iic寄存器配置

    千次阅读 2019-12-27 17:39:47
    #define MPU_IIC_SCL PBout(10) //SCL #define MPU_IIC_SDA PBout(11) //SDA #define MPU_READ_SDA PBin(11) //输入SDA 每次配置这个都要想很久,在这里记录一下 从keil这里打开文档 搜cnf ...
    //IO方向设置
    #define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
    #define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
    
    //IO操作函数	 
    #define MPU_IIC_SCL    PBout(10) 		//SCL
    #define MPU_IIC_SDA    PBout(11) 		//SDA	 
    #define MPU_READ_SDA   PBin(11) 		//输入SDA 

    每次配置这个都要想很久,在这里记录一下

    从keil这里打开文档

    搜cnf

    定位到这一页

    看这一句#define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}

    &=0XFFFF0FFF表示第12到15位都置零,刚好是CNF11和MODE11,因为是GPIOB,所以是B11

    GPIOB->CRH|=8<<12;其中8表示1000 即mode是00 input mode 然后cnf是10 input with pull-up 端口11占据12到15最低位12即相当于从0右移到12

     

     

    展开全文
  • 文章目录IIC读写寄存器时序图中断方式的实现流程中断方式的实现代码(主) IIC读写寄存器时序图 中断方式的实现流程 中断方式的实现代码(主) //直接读:发完器件从地址后直接读取数据 //直接写:发完器件从地址...

    IIC读写寄存器时序图

    在这里插入图片描述

    中断方式的实现流程

    在这里插入图片描述

    中断方式的实现代码(主)

    //直接读:发完器件从地址后直接读取数据
    //直接写:发完器件从地址后直接读取数据
    //子地址读:先发送器件从地址,再发寄存器地址,然后直接读
    //子地址写:先发送器件从地址,再发寄存器地址,然后直接写
       if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SBSEND)){
    		/* send slave address */
    		if(子地址读) {
    			i2c_master_addressing_dir(I2C1, I2C_sla & 0xFE); 
    		}else {
    			i2c_master_addressing_dir(I2C1, I2C_sla);
    		}
    	}else if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_RBNE)) {	    	    	    
    		if(I2C_num > 0) {
    			if(3 == I2C_num) {
    				/*wait until the second last data byte is received into the shift register*/
    				while(!i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BTC));
    				/* send a NACK for the last data byte */
    				i2c_ack_config(I2C1, I2C_ACK_DISABLE);
    			}
    			/* read a data byte from I2C_DATA*/
    			*I2C_buf++ = i2c_data_receive(I2C1);
    			I2C_num--;
    			if(0 == I2C_num) {
    				//读写完成
    				i2c_stop_on_bus(I2C1);/* send a stop condition */
    				i2c_ack_config(I2C1, I2C_ACK_ENABLE);
    				i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);			
    			}
    		}
        }else if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TBE)) {
            if(直接读) {
            	if(I2C_num > 0) {  
    			i2c_data_transmit(I2C1, *I2C_buf++);											
    			I2C_num--;
               	}else {
               	   //读写成功
               		i2c_stop_on_bus(I2C1);			
               	}						
            }else if(子地址读) {
            	if(子地址未发送) {    		
    				i2c_data_transmit(I2C1, 寄存器地址);//发送子地址
    		}else {
    			//转为直接读写
    			i2c_start_on_bus(I2C1);
    		}
            }else {  
            	i2c_data_transmit(I2C1,  寄存器地址);
               	//转为直接读写
            }	    	    	    
        } 
    
    展开全文
  • IIC STM8寄存器程序

    2020-03-08 22:57:53
    调试好的IIC程序,STM8寄存器版本,易移植,本人测试效果很好,希望可以帮助到新手,大神可以飘过。
  • RK3288 IIC 的相关寄存器的详细介绍和使用 The Inter-Integrated Circuit (I2C) is a two wired (SCL and SDA), bi-directional serial bus that provides an efficient and simple method of information exchange ...
  • STM32_IIC程序_寄存器

    2018-05-02 14:46:17
    学习STM32模拟IIC的使用,驱动24C02实现EEPROM数据读写. 硬件资源: 1,DS0(连接在PA8) 2,串口1(波特率:9600,PA9/PA10连接在板载USB转串口芯片CH340上面) 3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过GPIO驱动,...
  • &i2c1 { clock-frequency = <400000>; status = "okay"; // 添加 RTC 设备节点, @68 代表设备地址 ... // 根据 drivers/rtc/rtc-ds1307.c 中的 compatible 表找到的。...
  • 1.添加IIC读写寄存器方法: static struct class *cls = NULL; static struct i2c_client *rt5640_i2c_g = NULL; #define XYP_IIC_ADDR_LENGTH 1 s32 xyp_i2c_read(struct i2c_client *clie...

    废话不多说,直接上代码:

    1.添加IIC读写寄存器方法:

     
      

    static struct class *cls = NULL;

    static struct i2c_client *rt5640_i2c_g = NULL;


    #define
    XYP_IIC_ADDR_LENGTH 1 s32 xyp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) { struct i2c_msg msgs[2]; s32 ret=-1; s32 retries = 0; msgs[0].flags = !I2C_M_RD; msgs[0].addr = client->addr; msgs[0].len = XYP_IIC_ADDR_LENGTH; msgs[0].buf = &buf[0]; #ifdef CONFIG_I2C_ROCKCHIP_COMPAT msgs[0].scl_rate=200 * 1000; #endif msgs[1].flags = I2C_M_RD; msgs[1].addr = client->addr; msgs[1].len = len - XYP_IIC_ADDR_LENGTH; msgs[1].buf = &buf[XYP_IIC_ADDR_LENGTH]; #ifdef CONFIG_I2C_ROCKCHIP_COMPAT msgs[1].scl_rate=200 * 1000; #endif while(retries < 5) { ret = i2c_transfer(client->adapter, msgs, 2); if(ret == 2)break; retries++; } return ret; } s32 xyp_i2c_write(struct i2c_client *client,u8 *buf,s32 len) { struct i2c_msg msg; s32 ret = -1; s32 retries = 0; msg.flags = !I2C_M_RD; msg.addr = client->addr; msg.len = len; msg.buf = buf; #ifdef CONFIG_I2C_ROCKCHIP_COMPAT msg.scl_rate=200 * 1000; #endif while(retries < 5) { ret = i2c_transfer(client->adapter, &msg, 1); if (ret == 1)break; retries++; } return ret; } static ssize_t show_rt5640_reg( struct device *dev, struct device_attribute *attr, char *buf) { PAGE_SIZE; int i = 0, count = 0; u8 t_buf[4] = {0}; for(i = 0; i < 0xff; i++) { t_buf[0] = i; xyp_i2c_read(rt5640_i2c_g, t_buf, 3); printk("XYP_DEBUG read 0x%02x = 0x%02x \n", i, t_buf[1]); count += sprintf(buf + count, "0x%02x = 0x%04x\n", i, t_buf[1] << 8 | t_buf[2]); } return count; } static ssize_t store_rt5640_reg(struct class *dev, struct class_attribute *attr, const char *buf, size_t count) { int reg, value, ret; u8 t_buf[4] = {0}; sscanf(buf, "0x%x = 0x%x", &reg, &value); printk("XYP_DEBUG reg = 0x%02x, value = 0x%02x \n", reg, value); t_buf[0] = reg; t_buf[1] = (value & 0xff00) >> 8; t_buf[2] = value & 0xff; xyp_i2c_write(rt5640_i2c_g, t_buf, 3); return count; } static struct class_attribute attr[] = { __ATTR(rt5640_debug_reg, 0770, show_rt5640_reg, store_rt5640_reg), __ATTR_NULL, };

    2、在probe函数中创建/sys/class下的节点,并且创建相应的属性文件。

    cls = class_create(THIS_MODULE, "XYP_DEBUG_CODEC");
    class_create_file(cls, attr);
    rt5640_i2c_g = i2c;

     

    转载于:https://www.cnblogs.com/hei-da-mi/p/9111112.html

    展开全文
  • 出现的问题: 在IIC调试中,改好驱动后,发现寄存器写入的值和我用寄存器查看助手读出的值不一样,而且是所有的IIC寄存器写入的值和读出的值都不一样,驱动调试陷入停顿。 问题的原因: 操作寄存器不对,问题的...
  • 23.IIC控制器和MPU6050

    2021-08-06 07:17:25
    文章目录4412下的IIC控制器主机发送和接收的流程图IIC寄存器详解MPU6050原理MPU6050读写时序 4412下的IIC控制器 主机发送和接收的流程图 IIC寄存器详解 第一个寄存器: 中断:当主机发送完一个数据或接收完一个...
  • 在内核驱动中我想直接读写SPI和IIC寄存器,但通过ioremap后,无法写寄存器,请各位帮忙看看   科长大叔 2010-08-02 09:44 CLKCON这个寄存器需要设置 spi...
  • 英集芯移动电源芯片的IIC寄存器手册,不是数据手册。支持IP5209/IP5109/IP5207/IP5108等芯片,有详细的寄存器地址说明。
  • IIC读写16位地址的寄存器

    万次阅读 2016-12-12 10:46:01
    一般来说IIC器件的内部寄存器地址都是8位的,这样在进行读写操作时,发送完器件地址之后直接发送一个字节的寄存器地址,然后即可以进行读写。但是有的器件内部寄存器是按照16位地址编排的,例如一些EEPROM器件,由于...
  • 一、开发环境 开发软件:STVD 芯片型号:stm8s103 硬件接口:I2C(主模式) 二、寄存器主要用到的功能(按用户手册的顺序) 三、读写函数代码 四、调试心得
  • IIC协议不多说,操作其上的设备有话讲
  • 1. 模拟IIC 2. 硬件IIC 3. 模拟SPI 4. 硬件SPI 官方介绍: •只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL • 每个连接到总线的器件都可以通过唯一的地址和一直存在的...
  • 一般来说IIC器件的内部寄存器地址都是8位的,这样在进行读写操作时,发送完器件地址之后直接发送一个字节的寄存器地址,然后即可以进行读写。但是有的器件内部寄存器是按照16位地址编排的,例如一些EEPROM器件,由于...
  • 最近使用STM8L151G6U6做IIC从机使用,STM32F103做主机读取从机数据,发现主机读取数据的SCL时钟只要高于16KHz读取到的数据就出错,使用逻辑分析仪测试发现IIC通信的第一个地址位是有应答信号...尝试直接读写IIC寄存器
  • Created with Raphaël 2.2.0配置端口配置初始化函数IIC_GPIO_Init()配置GPIOB时钟-APB2ENR 配置GPIOB端口配置低寄存器-CRL清零配置GPIOB端口配置低寄存器-CRL初始化配置配置GPIOB端端口输出数据寄存器(GPIOx_ODR)...
  • 1、先看TMS320F28335的硬件IIC寄存器流程: 与32(此处指STM32、GD32)的IIC库函数流程有一些不同,DSP的操作都是寄存器操作,所以单独的发送过程与配置过程是没有解耦的,这也使得整个寄存器配置的时序相对而言有些...
  • ARMA9——IIC(二)

    2021-09-03 09:55:47
    一、IIC寄存器的配置 这是一个I2C总线的工作框图。 我们的4412芯片在有I2c总线通信有四种工作模式: 1)主机发送模式(Master Transmitter Mode):4412作为主机且是发送器 2) 主机接收模式(Master Receive Mode):4412...
  • IIC读取EVAL-ADXL355-PMDZ的寄存器值全为0 这里是我犯错的地方,大家注意一下,我把它改了之后数据就正常了
  • IIC读取语句里的语句: uchar DAC5571_check(void) { uchar slaveack; SDA_in; SCL_H; I2C_delay(); slaveack = SD...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,284
精华内容 3,713
关键字:

iic寄存器