CC2541 软件I2C
生活随笔
收集整理的這篇文章主要介紹了
CC2541 软件I2C
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在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; STOPdelay_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 slaver void send_ack(void) {SDA_OUT; //開路輸出,SDA_0; //OUT 0 ACKdelay_1ms();SCL_1;delay_1ms();SCL_0; }I2C檢測從機應帶信號
uint8 check_ack(void) {uint8 ack_flag;SDA_IN; //開路輸入,delay_1ms();SCL_1; //read ask begindelay_1ms();if(I2C_SDA_READ == BIT6){ //if (SDA==1)ack_flag = 0; //1: err}else{ack_flag = 1; //0: ok}SCL_0; //read ask endreturn 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.7usdat <<= 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 begindelay_1ms();dat <<= 1;SCL_0; //write TDOS_SDA enddelay_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
總結
以上是生活随笔為你收集整理的CC2541 软件I2C的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker配置daemon.json镜
- 下一篇: Unity尝试制作王者荣耀(十六)——F