nrf51822 --TWI(硬件IIC)

1.目的

   学习nrf51822硬件IIC通信

2.分析

    IIC是常用的通信接口,现在用IIC和MC3413加速度传感器通信来读取加速度值。TWI(Two Wire Interface)

3.平台:

协议栈版本:SDK10.0.0

编译软件:keil 5.14

硬件平台:nrf51822最小系统

例子:SDK 10.0.0\examples\ble_peripheral\ble_app_uart\pca10028\s110\arm4

4.步骤

  1.打开\SDK10.0\components\drivers_nrf\twi_master\deprecated目录

  

把twi_hw_master.c文件加入到工程里面。并设置路径


在twi _hw_master.c  里面添加函数如下:

ii2c_device_wirte_byte(uint8_t  address, uint8_t data) : 写某个地址的数据,address为寄存器地址,data是写数据 
bool i2c_device_wirte_data(uint8_t  address, uint8_t *data,uint8_t lenght) :往某地地址写数据

uint8_t i2c_device_read_byte(uint8_t address, uint8_t *p_read_byte,uint8_t length);在某个地址开始处读数据。

/*******************************************************************************
 * ???? :   i2c_device_wirte_byte                                                                 
 * ??     :   wang                                                     
 *                                                                               
 * ?   ?  :  void                                                                   
 * ?   ?  :  void
 * ?   ?  :  void                                                            
 * ???? : 20160317                                                                    
 *******************************************************************************/
bool i2c_device_wirte_byte(uint8_t  address, uint8_t data){
     uint8_t   write_byte[2];
		 write_byte[0] = address;
		 write_byte[1] = data;
		 return  twi_master_transfer(i2c_device_address,write_byte,sizeof(write_byte),TWI_ISSUE_STOP);
}
/*******************************************************************************
 * ???? :   i2c_device_wirte_data                                                                 
 * ??     :   wang                                                     
 *                                                                               
 * ?   ?  :  void                                                                   
 * ?   ?  :  void
 * ?   ?  :  void                                                            
 * ???? : 20160317                                                                    
 *******************************************************************************/

bool i2c_device_wirte_data(uint8_t  address, uint8_t *data,uint8_t lenght)
{
		 return  twi_master_transfer(i2c_device_address,data,lenght,TWI_ISSUE_STOP);
}
/*******************************************************************************
 * ???? :   i2c_device_read_byte                                                                 
 * ??     :   wang                                                     
 *                                                                               
 * ?   ?  :  void                                                                   
 * ?   ?  :  void
 * ?   ?  :  void                                                            
 * ???? : 20160317                                                                    
 *******************************************************************************/
uint8_t i2c_device_read_byte(uint8_t address, uint8_t *p_read_byte,uint8_t length)
{	    bool i2c_trans_state  = false ;
	    i2c_trans_state = twi_master_transfer(i2c_device_address,&address,1,TWI_ISSUE_STOP);
	    while(i2c_trans_state == false);
     	i2c_trans_state =twi_master_transfer(i2c_device_address | TWI_READ_BIT,p_read_byte,length,TWI_ISSUE_STOP);
			while(i2c_trans_state == false); 

		  return  <span style="font-family: Arial;">i2c_trans_state  </span><span style="font-family: Arial;">;</span>
}


2.在主函数里面添加对应的头文件


    

3.在#include "twi_master_config.h"中,设置SCL, SDA的管脚,中断脚,以及传感器地址。

/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 */

#ifndef TWI_MASTER_CONFIG
#define TWI_MASTER_CONFIG

#define TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER (8)
#define TWI_MASTER_CONFIG_DATA_PIN_NUMBER  (9)

#define GSENSOR_INT_PIN_NUMBER             (10)



#define I2C_ADR(address)                   (unsigned char)(address << 1)

#define GSENSOR_I2C_DEVICE_ADDRESS         I2C_ADR(0x4c)


#endif


3.在主函数中



仿真测试结果如下:读出器件的ID为0x1B

  

查看手册,画线的地方。*表示可以是任何值,可见0x1B是正确的、

 


表示通信成功。。。。。


附件:MC3413手册  http://share.weiyun.com/aec97649305e4e70dc10df94fe02ff49

### nRF52832 I2C 接口编程与硬件连接详情 #### 硬件连接细节 nRF52832 支持通过 TWI (Two-Wire Interface),即 I2C 进行通信。为了实现这一功能,需要将 SDA 和 SCL 引脚正确连接到外部设备上对应的引脚。具体来说: - **SDA**(数据线)应连接至目标器件的数据线; - **SCL**(时钟线)则需接至目标器件的时钟线上。 除了上述两条信号线外,还需确保电源和地线也已妥善连接,并且通常建议在 SDA 及 SCL 上各加一个约 4.7kΩ 的上拉电阻来稳定总线电平[^1]。 #### 编程驱动说明 对于 nRF52832 来说,在 SDK 中提供了用于配置和操作 I2C 总线的功能函数库 `twi_master.h` 。下面是一个简单的初始化实例代码片段展示如何设置并启动 I2C 主模式通讯: ```c #include "nrf_drv_twi.h" // 定义使用的TWI实例编号以及频率 #define TWI_INSTANCE_ID 0 #define TWI_FREQUENCY NRF_DRV_TWI_FREQ_100K static const nrf_drv_twi_config_t twi_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = TWI_FREQUENCY, .interrupt_priority = APP_IRQ_PRIORITY_LOWEST, .clear_bus_init = false }; void setup_i2c() { ret_code_t err_code; // 初始化TWI模块 err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL); APP_ERROR_CHECK(err_code); // 启用TWI中断(如果需要的话) nrf_drv_twi_enable(&m_twi); } ``` 此段程序展示了基本的 I2C 配置过程,包括指定所要使用的 GPIO 脚位作为 SDA/SCL ,设定传输速率等参数。之后调用 `nrf_drv_twi_init()` 函数完成实际初始化工作,并启用该接口以便后续可以发送接收数据帧。 #### 数据收发流程 当完成了必要的初始化后,就可以利用相应的 API 实现读写操作了。例如向从机地址为 `ADDR` 的设备寄存器位置 `REG_ADDR` 写入单字节数据 `DATA` : ```c uint8_t data_to_send[] = { REG_ADDR, DATA }; err_code = nrf_drv_twi_tx(&m_twi, ADDR << 1, data_to_send, sizeof(data_to_send), false); APP_ERROR_CHECK(err_code); ``` 而如果是想要从相同条件下获取返回值,则可采用如下方式执行读取命令: ```c uint8_t reg_addr = REG_ADDR; err_code = nrf_drv_twi_tx(&m_twi, ADDR << 1, ®_addr, 1, true); // 发送寄存器地址 if (err_code != NRF_SUCCESS) { // 处理错误... } uint8_t received_data; err_code = nrf_drv_twi_rx(&m_twi, ADDR << 1, &received_data, 1); if (err_code != NRF_SUCCESS) { // 处理错误... } ``` 这里先发送欲访问的目标寄存器偏移量给对方知晓我们希望取得哪部分的信息;紧接着再发起一次单独针对读回响应内容的操作请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值