在上篇介绍了OLED的II以写操作为主,没有进行读取操作。所以在现再补充读取的操作。

我在此以LIS2DH为例子

uint8_t temp;
lis2dh_read_registers(LIS2DH_WHO_AM_I,&temp,);

我们现在操作的寄存器为who_am_i时序如下

好了现在贴上主要代码

#define MEMS_LIS2DH_ADDR         (0x30U>>1)

#define LIS2DH_WHO_AM_I           0x0F  

#define MEMS_TWI_TIMEOUT          5000 

static const nrf_drv_twi_t m_twi_mems_lis2ds12 = NRF_DRV_TWI_INSTANCE();//需要在nrf_drv_config.h文件中 #define TWI1_ENABLED 1

volatile static bool twi_tx_done = false;
volatile static bool twi_rx_done = false; void mems_lis2dh12_twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{   
    ret_code_t err_code;
    
    switch(p_event->type)
    {
        case NRF_DRV_TWI_RX_DONE:
            twi_rx_done = true;
            break;
        case NRF_DRV_TWI_TX_DONE:
            twi_tx_done = true;
            break;
        default:
            break;        
    }   
} void bsp_lis2dh12_init(void)
{
    ret_code_t err_code;     const nrf_drv_twi_config_t twi_mems_lis2dh12_config =
    {
        .scl                = MEMS_LIS2DH12_I2C_SCL_PIN,
        .sda                = MEMS_LIS2DH12_I2C_SDA_PIN,
        .frequency          = NRF_TWI_FREQ_100K,
        .interrupt_priority = APP_IRQ_PRIORITY_LOW
    };     err_code = nrf_drv_twi_init(&m_twi_mems_lis2dh12, &twi_mems_lis2dh12_config, mems_lis2dh12_twi_handler, NULL);
    APP_ERROR_CHECK(err_code);     nrf_drv_twi_enable(&m_twi_mems_lis2dh12);     nrf_gpio_pin_clear(MEMS_LIS2DH12_SD0_PIN);
    nrf_gpio_cfg_output(MEMS_LIS2DH12_SD0_PIN);     nrf_gpio_pin_set(MEMS_LIS2DH12_CS_PIN);
    nrf_gpio_cfg_output(MEMS_LIS2DH12_CS_PIN); } uint32_t lis2dh12_write_register(uint8_t reg_param, uint8_t data_param)
{
    uint32_t err_code;
    uint32_t timeout = MEMS_TWI_TIMEOUT;     uint8_t packet[2] = {reg_param, data_param};     err_code = nrf_drv_twi_tx(&m_twi_mems_lis2dh12, MEMS_LIS2DH12_ADDR, packet, 2, false);
    
    if(err_code != NRF_SUCCESS)
    {
        return err_code;    
    }     while((!twi_tx_done) && --timeout);
    
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;    
    }     twi_tx_done = false;     return err_code;
} uint32_t lis2dh12_read_registers(uint8_t reg_param, uint8_t * p_data, uint32_t length)
{
    uint32_t err_code;
    uint32_t timeout = MEMS_TWI_TIMEOUT;     err_code = nrf_drv_twi_tx(&m_twi_mems_lis2dh12, MEMS_LIS2DH12_ADDR, &reg_param, 1, false);
    if(err_code != NRF_SUCCESS)
    {
        return err_code;    
    }     while((!twi_tx_done) && --timeout);
    
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;    
    }
    
    twi_tx_done = false;     err_code = nrf_drv_twi_rx(&m_twi_mems_lis2dh12, MEMS_LIS2DH12_ADDR, p_data, length, false);                           
    if(err_code != NRF_SUCCESS)
    {
        return err_code;
    }     timeout = MEMS_TWI_TIMEOUT;
    
    while((!twi_rx_done) && --timeout);
    
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;
    }
    
    twi_rx_done = false;     return err_code;
}

NRF51822之IIC(MEMS_LIS2DH12)的更多相关文章

  1. nRF51822之模拟IIC

    使用的工程为是基于sdk10工程 在将以nRF51_SDK_10.0.0_dc26b5e\examples\peripheral\twi_sensor作为模版 修改代码main.c #include ...

  2. nrf51822裸机教程-IIC

    关于IIC总线的核心有以下几点: :时钟线高电平期间必须保持数据线不变. :时钟线低电平期间可以改变数据. :时钟线和数据线上都要接上拉电阻,以使总线不工作时,两根线的电平都处于高电平状态. :每个传 ...

  3. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  4. 《我的嵌入式开发》---- IIC 通信

    IIC 通用文件,文件是在NRF51xx 芯片基础,keil 平台开发测试通过,后期修改为STM32F2xx系列的配置. 文件百度云盘链接 : https://pan.baidu.com/s/1AFx ...

  5. Nordic NRF51822 从零开始系列(外部设备片—MPU6050DMP驱动的移植)

    一.硬件准备             (1)开发板和软件参看 Nordic NRF51822 从零开始系列(一)开发环境的搭建             (2)mpu6050模块 二.前置知识     ...

  6. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  7. 基于STM32Cube的IIC主从通信

    1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...

  8. STM32 IIC

    #include "Type.h" #include "IIC.h" #include "Delay.h" void I2C_Init(vo ...

  9. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...

随机推荐

  1. python3.5学习笔记--一个简单的图片爬虫

    参考资料:http://v.qq.com/boke/page/q/g/t/q01713cvdgt.html 目的:爬取网站图片 实际上以上链接的视频中已经将整个过程说的非常明白了,稍微有点计算机基础的 ...

  2. 将类数组arguments转化成数组

    一.将arguments对象绑定到slice方法上 二. 例子: //闭包 二次封装函数 求和 function partialUsingArguments(fn) { var args = Arra ...

  3. Redis执行Lua脚本的情况

    第一个测试: 往Redis里面存入1000个Hash,每个Hash里面有100个元素(Key 0-99,值是Key^2). PHP代码,执行33s左右 <?php $redis = new Re ...

  4. MySQL concat函数的使用

    MySQL concat函数是MySQL数据库中众多的函数之一,下文将对MySQL concat函数的语法和使用进行说明,供您参考和学习. MySQL concat函数使用方法:CONCAT(str1 ...

  5. 关于STM32的FLASH操作【转载】

    说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置.芯片ID.自举程序等等.当然, FLASH还可以用来装数据. FLASH分 ...

  6. VS2010 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0@VCTargetPath处的属性表达式

    VS2010打开.csproj工程文件报错,不能加载,错误信息如下: 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\1 ...

  7. Unity关于脚本前面的勾选框

    今天做项目时需要在某个事件条件下禁用某个脚本,但是突然发现这个脚本前面没有勾选框,,,就像这样 网上搜了下,原来是需要在脚本中加上void Start()方法,即使这个方法里什么都没有 void St ...

  8. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

  9. mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

    同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...

  10. 由system.currentTimeMillis() 获得当前的时间

    System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...