CC2541 软件I2C
来源:互联网 发布:大数据设计哪些技术 编辑:程序博客网 时间:2024/06/05 16:50
在CC2541上硬件I2C不是很稳定,因此写了个软件I2C例程
宏定义软件I2C中I\O及操作
#define SCL P1_5 //定义模拟IIC的时钟线#define SDA P1_6 //定义模拟IIC的数据线#define SDA_0 (P1_6=0) //SDA=0#define SDA_1 (P1_6=1) //SDA=1#define SCL_0 (P1_5=0) //SCL=0#define SCL_1 (P1_5=1) //SCL=1#define SDA_IN P1DIR &= ~BIT6 //SDA INPUT#define SDA_OUT P1DIR |= BIT6 //SDA OUTPUT#define SCL_IN P1DIR &= ~BIT5 //SCL INPUT#define SCL_OUT P1DIR |= BIT5 //SCL OUTPUT#define I2C_SDA_READ (P1 & BIT6)
I2C间断延时函数
void delay_1ms(void) //误差 0us 延时1ms{ uint8 a,c; for(c=4;c>0;c--) { //for(b=142;b>0;b--) { for(a=2;a>0;a--) { } } }}
I2C初始化函数
void IIC_Init(void)//IIC初始化{ P1DIR |= 0x60; //P1.5、P1.6定义为输出 SDA_0; SCL_0; delay_1ms(); SCL_1; SDA_1; delay_1ms();}
I2C起始信号
/* * 启动iic */// static void start(void) {void start(void){ SDA_OUT; //开路输出,并输出0. SCL_OUT; SDA_1; //SDA = 1; SCL_1; //SCL = 1; delay_1ms(); SDA_0; //SDA = 0; delay_1ms(); SCL_0; //SCL = 0; //START}
I2C停止信号
/* *停止iic */void stop(void){ SDA_OUT; //开路输出,并输出0. SCL_0; //SCL = 0; delay_1ms(); SCL_1; //SCL = 1; STOP delay_1ms(); SDA_1; //SDA = 1; SDA_IN; SCL_IN;}
I2C主机发送无应答信号
//***********************************************************************************//*名称:i2c_send_noack() *//*功能:无应答I2C总线 *//*参数:无 *//*返回:1 有NOACK信号 0 无NOACK信号 *//***********************************************************************************void send_noack(void){ SDA_OUT; //开路输出, SDA_1; //SDA = 1; NO ACK delay_1ms(); SCL_1; //SCL = 1; delay_1ms(); SCL_0; //SCL = 0; //START}
I2C主机发送应答信号
// iic 应答 for slavervoid send_ack(void) { SDA_OUT; //开路输出, SDA_0; //OUT 0 ACK delay_1ms(); SCL_1; delay_1ms(); SCL_0;}
I2C检测从机应带信号
uint8 check_ack(void) { uint8 ack_flag; SDA_IN; //开路输入, delay_1ms(); SCL_1; //read ask begin delay_1ms(); if(I2C_SDA_READ == BIT6){ //if (SDA==1) ack_flag = 0; //1: err }else{ ack_flag = 1; //0: ok } SCL_0; //read ask end return ack_flag;}
I2C读一个字节
/* * iic读一个字节 */uint8 iic_read(void) { uint8 j, dat = 0; SDA_IN; //开路输入, for (j = 0; j < 8; j++) { SCL_1; //read TDOS_SDA begin. delay 0.7us dat <<= 1; delay_1ms(); delay_1ms(); if(I2C_SDA_READ == BIT6){ //if (SDA==1) dat |= 0x01; //input TDOS_SDA } SCL_0; //read TDOS_SDA end. delay 1.4us } return dat;}
I2C写一个字节
/* * iic写一个字节 */void iic_write(uint8 datIn) { uint8 dat, j; dat = datIn; SDA_OUT; SCL_0; for (j = 0; j < 8; j++) { if((dat & 0x80)) SDA_1; else SDA_0; delay_1ms(); delay_1ms(); SCL_1; //write TDOS_SDA begin delay_1ms(); dat <<= 1; SCL_0; //write TDOS_SDA end delay_1ms(); }}
头文件函数声明
void delay_1ms(void);void IIC_Init(void);void stop(void);void start(void);void send_noack(void);void send_ack(void);void iic_write(uint8 datIn);uint8 check_ack(void);uint8 iic_read(void);
GitHub工程源代码:
https://github.com/lanhaixuan/CC2541_VL6180X_BMA250
阅读全文
0 0
- CC2541 软件I2C
- cc2541 硬件i2c 读AT24CM01
- cc2541软件延时函数
- CC2541
- CC2541 之CCDEBUG软件终究修复教程
- GPIO软件模拟I2C
- GPIO软件模拟I2C
- 软件模拟I2C
- 软件模拟I2C
- I2C软件模拟驱动
- stm32软件模拟I2C
- 软件模拟I2C总线操作。
- I2C软件编程中注意事项
- I2C 协议之软件模拟时序
- 【二】CC2541 阿莫BLE开发板 与 BTool软件的连接 以及 读写UUID
- I2C
- I2C
- i2c
- ssh学习总结
- ucos ii 软件定时器,delay函数
- php字符串函数相关试题场景
- 学习笔记:C++ 函数重载
- bug排坑记录
- CC2541 软件I2C
- SAP固定资产的几个关键日期
- Planet: Understanding the Amazon from Space 获奖者心得
- 多任务学习“Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics”
- [Windows]_[系统内部版本号对照表]
- OpenSessionInViewFilter源码分析
- gcc版本查看
- 后台秒杀架构设计与实现(一)
- 小猪的Python学习之旅 —— 1.基础知识储备