IO口模拟I2C收发信息
来源:互联网 发布:35互联域名证书生成 编辑:程序博客网 时间:2024/05/16 12:35
IO口模拟I2C收发信息
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "types.h"
#include "FreeRTOS.h"
#include "task.h"
#include "lib_gpio.h"
#include "ath8809.h"
#include "bcmw_sleep.h"
#include "bcmw_thread.h"
#define I2C_SCL_PIN ((0) * 32 + (1))
#define I2C_SDA_PIN ((0) * 32 + (3))
#define I2C_RESET_PIN ((1) * 32 + (22))
#define test_ath 1
u8 ath8809_reg_val[][4]=
{
{0x1E,0x34 ,0x00,0x9A},
{0x1E,0x3D ,0x02,0x01},
{0x1E,0x3E ,0x01,0x00},
{0x1E,0x44 ,0x00,0xB1},
{0x1E,0x45 ,0x07,0xFC},
{0x1E,0x46 ,0x00,0x7C},
{0x1E,0x4C ,0x02,0x00},
{0x1E,0x4D ,0x02,0x20},
{0x1E,0x63 ,0x00,0x02},
{0x1E,0x86 ,0x00,0x07},
{0x1E,0x87 ,0x00,0x03},
{0x1E,0x92 ,0x30,0x00},
{0x1E,0x9A ,0x30,0x00},
{0x1E,0xA2 ,0x50,0x00},
{0x1E,0xBD ,0x70,0x20},
{0x1E,0xBE ,0x70,0x10},
{0x1E,0xBF ,0x70,0x00},
{0x1E,0xC0 ,0x08,0x00},
{0x1E,0xC1 ,0x0A,0x00},
{0x1E,0xC2 ,0x10,0x00},
{0x1E,0xE2 ,0x0B,0x00},
{0x1E,0xE3 ,0x03,0x00},
{0x1E,0xE4 ,0x10,0x00},
{0x1E,0xEF ,0x07,0x00},
{0x1F,0x10 ,0x7F,0xFF},
{0x1F,0x11 ,0x60,0x50},
{0x1F,0x12 ,0x4C,0x9F},
{0x1F,0x13 ,0x3F,0x82},
{0x1F,0x14 ,0x36,0x3E},
{0x1F,0x15 ,0x2E,0xB2},
{0x1F,0x16 ,0x27,0x11},
{0x1F,0x17 ,0x1E,0xF8},
{0x1F,0x18 ,0x17,0xCB},
{0x1F,0x19 ,0x12,0xF0},
{0x1F,0x28 ,0x0C,0x00},
{0x1F,0x29 ,0x10,0x00},
{0x1F,0x4B ,0x00,0x00},
{0x1E,0x3A, 0x00,0x00},
};
#if 0
void misc_config_pin_multiplex_36S16MHSM()
{
/**/
unsigned long reg_val = 0;
/*
0x50
[3:2]----------GPIO_0[1] GPIO模拟I2C控制消回音芯片
0: TCK
1: GPIO_0[1]
2: PWM4
3: UART2_SIN
[5:4]----------GPIO_0[2] 红外灯调光控制PWM
0: TMS
1: GPIO_0[2]
2: PWM5
3: UART2_SOUT
[7:6]----------GPIO_0[3] GPIO模拟I2C控制消回音芯片
0: TDO
1: GPIO_0[3]
2: PWM6
3: DMIC_DATA
[9:8]----------GPIO_0[4] 音频开关控制,高有效
0: TDI
1: GPIO_0[4]
2: PWM7
3: DMIC_CLK
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x50));
reg_val &= (~(0xfful << 2));
reg_val |= (0x55ul << 2);
*((unsigned long *)(0x90c00000 + 0x50)) = reg_val;
/*
0x54
[7:6]----------GPIO_0[10] 水平限位开关,低有效
0: GPIO_0[10]
1: CAP0_D[7]
2: BAYER_D3
3: SD1_CMD_RSP
[9:8]----------GPIO_0[11] 垂直电机驱动信号1
0: GPIO_0[11]
1: CAP0_D[6]
2: BAYER_D2
3: SD1_D3
[11:10]----------GPIO_0[12] 垂直电机驱动信号2
0: GPIO_0[12]
1: CAP0_D[5]
2: BAYER_D1
3: SD1_D2
[13:12]----------GPIO_0[13] 垂直电机驱动信号3
0: GPIO_0[13]
1: CAP0_D[4]
2: BAYER_D0
[15:14]----------GPIO_0[14] 垂直电机驱动信号4
0: GPIO_0[14]
1: CAP0_D[3]
2: I2C_SCL
3: SSP1_FS
[17:16]----------GPIO_0[15] 镜头驱动控制STB
0: GPIO_0[15]
1: CAP0_D[2]
2: I2C_SDA
3: SSP1_RXD
[19:18]----------GPIO_0[16] 镜头驱动时钟SCLK
0: GPIO_0[16]
1: CAP_LO8_D1
2: None
3: SSP1_TXD
[21:20]----------GPIO_0[17] 镜头驱动数据SDATA
0: GPIO_0[17]
1: CAP_LO8_D0
2: None
3: SSP1_SCLK
[23:22]----------I2C_SCL I2C总线,挂sensor
0: GPIO_0[18]
1: I2C_SCL
2: PWM2
[25:24]----------I2C_SDA I2C总线,挂sensor
0: GPIO_0[19]
1: I2C_SDA
2: PWM3
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x54));
reg_val &= (~(0xffffful << 6));
reg_val |= (0x05ul << 22);
*((unsigned long *)(0x90c00000 + 0x54)) = reg_val;
/*
0x58
[3:2]----------SD_DAT[0] SD CARD总线
0: GPIO_0[24]
1: SD_DAT[0]
[5:4]----------SD_DAT[1] SD CARD总线
0: GPIO_0[25]
1: SD_DAT[1]
[7:6]----------SD_DAT[2] SD CARD总线
0: GPIO_0[26]
1: SD_DAT[2]
[9:8]----------SD_DAT[3] SD CARD总线
0: GPIO_0[27]
1: SD_DAT[3]
[11:10]----------GPIO_0[28] 水平电机驱动信号1
0: GPIO_0[28]
1: SSP1_FS
[13:12]----------GPIO_0[29] 水平电机驱动信号2
0: GPIO_0[29]
1: SSP1_TXD
2: SD1_CMD_RSP
[15:14]----------GPIO_0[30] 水平电机驱动信号3
0: GPIO_0[30]
1: SSP1_RXD
2: SD1_DAT[3]
3: OTG_48M_dbg
[17:16]----------GPIO_0[31] 水平电机驱动信号4
0: GPIO_0[31]
1: SSP1_SCLK
2: SD1_DAT[2]
3: OTG_30M_dbg
[19:18]----------SD_CD SD CARD总线
0: GPIO_1[0]
1: SD_CD
[21:20]----------SD_CLK SD CARD总线
0: GPIO_1[1]
1: SD_CLK
[23:22]----------SD_CMD_RSP SD CARD总线
0: GPIO_1[2]
1: SD_CMD_RSP
[25:24]----------GPIO_1[3] IR CUT控制1
0: GPIO_1[3]
1: UART2_SIN
[27:26]----------GPIO_1[4] IR CUT控制2
0: GPIO_1[4]
1: UART2_SOUT
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x58));
reg_val &= (~(0x3fffffful << 2));
reg_val |= (0x55ul << 2);
reg_val |= (0x15ul << 18);
*((unsigned long *)(0x90c00000 + 0x58)) = reg_val;
/*
0x5c
[25:24]----------GPIO_1[19] CC3200 准备OK, GPIO高低 输入
0: GPIO_1[19]
1: SD1_CD
2: LC_DATA[12]
4: TV_DATA[12]
[27:26]----------GPIO_1[20] GM8136S 准备OK, GPIO 输出
0: GPIO_1[20]
1: SD1_DAT[1]
2: LC_DATA[13]
3: TV_DATA[13]
[29:28]----------GPIO_1[21] 红外灯开关控制,高开
0: GPIO_1[21]
1: SD1_DAT[0]
2: LC_DATA[14]
4: TV_DATA[14]
[31:30]----------GPIO_1[22] 回声抵消芯片复位
0: GPIO_1[22]
1: SD1_CLK
2: LC_DATA[15]
3: TV_DATA[15]
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x5c));
reg_val &= (~(0xfful << 24));
*((unsigned long *)(0x90c00000 + 0x5c)) = reg_val;
/*
0x60
[13:12]----------PWM0 镜头控制STEP1
0: GPIO_1[28]
1: PWM0
2: DMIC_DATA
[15:14]----------PMW1 镜头控制STEP2
0: GPIO_1[29]
1: PWM1
2: DMIC_CLK
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x60));
reg_val &= (~(0x0ful << 12));
reg_val |= (0x05ul << 12);
*((unsigned long *)(0x90c00000 + 0x60)) = reg_val;
/*
0x64
[1:0]----------SSP1_SCLK CC3200 SPI 通信SPI_CLK
0: GPIO_1[27]
1: SSP1_SCLK (If SSP1 is slave mode, then bit [8] must be logic 1.)
2: LC_HS
[3:2]----------SSP1_FS CC3200 SPI 通信SPI_CS
0: GPIO_1[24]
1: SSP1_FS
2: UART1_SIN
[5:4]----------SSP1_TXD CC3200 SPI 通信SPI_TXD
0: GPIO_1[25]
1: SSP1_TXD
2: UART1_SOUT
[7:6]----------SSP1_RXD CC3200 SPI 通信SPI_RXD
0: GPIO_1[26]
1: SSP1_RXD
2: LC_VS
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x64));
reg_val &= (~(0xfful << 0));
reg_val |= (0x55ul << 0);
*((unsigned long *)(0x90c00000 + 0x64)) = reg_val;
/*
XAIN0 CDS 检测,GPIO 高低输入
DN0 (PLDATA0) MIPI 总线
DP0 (PLDATA1) MIPI 总线
CKN (PLDATA2) MIPI 总线
CKP (PLDATA3) MIPI 总线
*/
}
void misc_config_pin_dir()
{
/**/
unsigned long reg_val = 0;
/*
0x50
[3:2]----------GPIO_0[1] GPIO模拟I2C控制消回音芯片
0: TCK
1: GPIO_0[1]
2: PWM4
3: UART2_SIN
[5:4]----------GPIO_0[2] 红外灯调光控制PWM
0: TMS
1: GPIO_0[2]
2: PWM5
3: UART2_SOUT
[7:6]----------GPIO_0[3] GPIO模拟I2C控制消回音芯片
0: TDO
1: GPIO_0[3]
2: PWM6
3: DMIC_DATA
[9:8]----------GPIO_0[4] 音频开关控制,高有效
0: TDI
1: GPIO_0[4]
2: PWM7
3: DMIC_CLK
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x50));
reg_val &= (~(0xfful << 2));
reg_val |= (0x55ul << 2);
*((unsigned long *)(0x90c00000 + 0x50)) = reg_val;
}
void misc_config_pin_test()
{
#if 1
/**/
unsigned long reg_val = 0;
/*
0x50
[3:2]----------GPIO_0[1] GPIO模拟I2C控制消回音芯片
0: TCK
1: GPIO_0[1]
2: PWM4
3: UART2_SIN
[5:4]----------GPIO_0[2] 红外灯调光控制PWM
0: TMS
1: GPIO_0[2]
2: PWM5
3: UART2_SOUT
[7:6]----------GPIO_0[3] GPIO模拟I2C控制消回音芯片
0: TDO
1: GPIO_0[3]
2: PWM6
3: DMIC_DATA
[9:8]----------GPIO_0[4] 音频开关控制,高有效
0: TDI
1: GPIO_0[4]
2: PWM7
3: DMIC_CLK
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x50));
printf("mutli GPIO0_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x90c00000 + 0x5c));
printf(" mutli GPIO1_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91000000 + 0x08));
printf("direction GPIO0_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91900000 + 0x08));
printf("direction GPIO1_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91000000 + 0x0));
printf("value GPIO0_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91900000 + 0x0));
printf("value GPIO1_1:%x \n", reg_val);
#endif
}
void misc_config_pin_value()
{
#if 1
/**/
unsigned long reg_val = 0;
/*
0x50
[3:2]----------GPIO_0[1] GPIO模拟I2C控制消回音芯片
0: TCK
1: GPIO_0[1]
2: PWM4
3: UART2_SIN
[5:4]----------GPIO_0[2] 红外灯调光控制PWM
0: TMS
1: GPIO_0[2]
2: PWM5
3: UART2_SOUT
[7:6]----------GPIO_0[3] GPIO模拟I2C控制消回音芯片
0: TDO
1: GPIO_0[3]
2: PWM6
3: DMIC_DATA
[9:8]----------GPIO_0[4] 音频开关控制,高有效
0: TDI
1: GPIO_0[4]
2: PWM7
3: DMIC_CLK
*/
reg_val = *((unsigned long *)(0x90c00000 + 0x50));
printf("mutli GPIO0_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91000000 + 0x08));
printf("direction GPIO0_1:%x, ", reg_val);
reg_val = *((unsigned long *)(0x91000000 + 0x0));
printf("value GPIO0_1 0_3:%x, \n", reg_val);
#endif
}
#endif
static void DELAY(s32 X)
{
s32 counter1= 0x80;
s32 counter2= 0x80;
while(counter1 > 0 && counter2 > 0)
{
counter1--;
counter2--;
}
}
/*?′??8809μúò?′??????á2?3é1|£?μú?t′??òok£??-òò?′?a*/
static s32 ath8809_hw_reset(u32 i2c_reset_pin)
{
gm_gpio_direction_output(i2c_reset_pin,0);
BC_Msleep(20);
gm_gpio_direction_output(i2c_reset_pin,1);
BC_Msleep(20);
return 0;
}
static s32 i2c_init(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
/* default out H */
gm_gpio_direction_output(i2c_scl_pin,1);
gm_gpio_direction_output(i2c_sda_pin,1);
return 0;
}
static s32 i2c_start(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
//i2c_set SDA,SCL
gm_gpio_direction_output(i2c_scl_pin,1);
gm_gpio_direction_output(i2c_sda_pin,1);
DELAY(1);
//i2c_clr SDA
gm_gpio_direction_output(i2c_sda_pin,0);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
return 0;
}
static s32 i2c_stop(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
//i2c_clr SDA
gm_gpio_direction_output(i2c_sda_pin,0);
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
//i2c_set SDA
gm_gpio_direction_output(i2c_sda_pin,1);
DELAY(1);
return 0;
}
static u8 recv_bit(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
unsigned char gpio_value = 0;
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
/* set dir in */
gm_gpio_direction_input(i2c_sda_pin);
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
gpio_value = gm_gpio_get_value(i2c_sda_pin);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
if(gpio_value)
{
return 1;
}
else
{
return 0;
}
}
static u8 i2c_recv_ack(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
return !recv_bit(i2c_scl_pin,i2c_sda_pin);
}
/*return 1:write fail,rewrite;return 0:write success*/
static s32 ath8809_i2c_write(u32 i2c_scl_pin,u32 i2c_sda_pin,u8 *pdata, u8 len)
{
u32 ret = 0;
u8 i;
u8 bit=0x80;
u8 *p;
u8 dev_sync[]= {0xc0,0xfc,0xf3,0x3b}; /* deviceid: 1byte, sync:2byte cmd:1byte*/
u8 nreg = 0;
portENTER_CRITICAL();
/* start */
i2c_start(i2c_scl_pin,i2c_sda_pin);
i=0;
for(nreg = 0; nreg < len/4; nreg++)
{
for(; i < 8; i++)
{
if(i < 4)
{
p = (u8*)&dev_sync[i];
}
else
{
p = &pdata[nreg*4+i-4];
}
for(bit=0x80; bit; bit >>= 1)
{
if(bit&*p)
{
//i2c_set SDA
gm_gpio_direction_output(i2c_sda_pin,1);
// misc_config_pin_test();
// printf("1 ");
// misc_config_pin_value();
}
else
{
//i2c_clr SDA
gm_gpio_direction_output(i2c_sda_pin,0);
// misc_config_pin_test();
// printf("0 ");
// misc_config_pin_value();
}
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
}
/* recv ack */
if(!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
{
printf("ath8809 no ack reg=0x%02x%02x !!!\n", pdata[nreg*4]&0xff,pdata[nreg*4+1]&0xff);
ret = 1;
goto out;
}
}
}
out:
/* stop */
i2c_stop(i2c_scl_pin,i2c_sda_pin);
portEXIT_CRITICAL();
return 0;
return ret;
}
static s32 i2c_send_ack(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
// i2c_clr SCL
//i2c_clr SDA
gm_gpio_direction_output(i2c_scl_pin,0);
gm_gpio_direction_output(i2c_sda_pin,0);
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
return 0;
}
/*return 1:read fail,rewrite;return 0:read success*/
static s32 ath8809_i2c_read(u32 i2c_scl_pin,u32 i2c_sda_pin,u8 *din, u8 *dout)
{
u32 ret = 0;
u8 i;
u8 bit=0x80;
u8 *p;
u8 dev_sync[]= {0xc0,0xfc,0xf3,0x37}; /* deviceid: 1byte, sync:2byte cmd:1byte*/
/* start */
i2c_start(i2c_scl_pin,i2c_sda_pin);
for(i = 0; i < 4+2; i++)
{
if(i < 4)
{
p = (u8*)&dev_sync[i];
}
else
{
p = din+i-4;
}
for(bit=0x80; bit; bit >>= 1)
{
if(bit&*p)
{
//i2c_set SDA
gm_gpio_direction_output(i2c_sda_pin,1);
}
else
{
//i2c_clr SDA
gm_gpio_direction_output(i2c_sda_pin,0);
}
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
}
/* recv ack */
if(!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
{
printf("ath8809_i2c_read no ack !!!\n");
ret = 1;
goto out;
}
}
i2c_stop(i2c_scl_pin,i2c_sda_pin);
i2c_start(i2c_scl_pin,i2c_sda_pin);
dev_sync[0]=dev_sync[0] | 0x01;
p= &dev_sync[0];
for(bit=0x80; bit; bit >>= 1)
{
if(bit&*p)
{
//i2c_set SDA
gm_gpio_direction_output(i2c_sda_pin,1);
}
else
{
//i2c_clr SDA
gm_gpio_direction_output(i2c_sda_pin,0);
}
DELAY(1);
//i2c_set SCL
gm_gpio_direction_output(i2c_scl_pin,1);
DELAY(1);
DELAY(1);
//i2c_clr SCL
gm_gpio_direction_output(i2c_scl_pin,0);
DELAY(1);
}
if (!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
{
printf("ath8809_i2c_read no ack !!!\n");
ret = 1;
goto out;
}
for(i=0; i < 2; i++)
{
p=&dout[i];
*p=0;
for(bit=0x80; bit; bit >>= 1)
{
*p <<= 1;
*p |= recv_bit(i2c_scl_pin,i2c_sda_pin);
}
i2c_send_ack(i2c_scl_pin,i2c_sda_pin);
}
out:
/* stop */
i2c_stop(i2c_scl_pin,i2c_sda_pin);
printf("recv dout[0] = %02x ,dout[1] = %02x \n",dout[0],dout[1]);
return ret;
}
/* 一定要加延时,芯片上电太慢,等待上电完成再初始化配置,否则芯片不能正常工作*/
s32 ath8809_init(u32 i2c_scl_pin,u32 i2c_sda_pin,u32 i2c_reset_pin,BC_Thread_handle_t handle)
{
printf("ath8809_init,I2C_SCL_PIN = %d, I2C_SDA_PIN = %d,I2C_RESET_PIN = %d \n",i2c_scl_pin,i2c_sda_pin,i2c_reset_pin);
s32 len = 0;
s32 i = 0;
BC_Msleep(1500);
i2c_init(i2c_scl_pin,i2c_sda_pin);
ath8809_hw_reset(i2c_reset_pin);
len = sizeof(ath8809_reg_val)/4;
// printf("ath8809 init,len = %d \n",len);
for(i= 0; i < len; i++)
{
if(ath8809_i2c_write(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], 4))
{
//try again
printf("try i2c write ath8809 again \n");
BC_Thread_feed_dog(handle);
ath8809_i2c_write(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], 4);
}
}
#if 0
printf("write over,start read \n");
for(i = 0; i < 37; i++)
{
memset(data,0,sizeof(data));
while ((ath8809_i2c_read(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], (u8*)&data)!= 0) && (count < 3))
{
// try again
printf("try i2c read ath8809 again \n");
ath8809_i2c_read(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], (u8*)&data);
count++;
}
printf("[%d]: %02x%02x \n", i,data[0], data[1]);
data[0] = 0;
data[1] = 0;
if (count >= 3)
{
printf("error, over \n");
count = 0;
}
}
#endif
printf("ath8809_init over\n");
return 0;
}
static void init_ath8809_thread(BC_Thread_handle_t handle, void* para)
{
s32 ret = ath8809_init(I2C_SCL_PIN,I2C_SDA_PIN,I2C_RESET_PIN,handle);
if(0 != ret)
{
printf("ath8809_init fail \n");
}
}
s32 init_ath8809_handle(void )
{
BC_Thread_handle_t init_ath8809;
BC_Thread_para_t thread_para;
BC_Thread_para_init(&thread_para);
thread_para.m_depth = 0x400;
init_ath8809 = BC_Thread_create(init_ath8809_thread,(char *)"init_ath8809",NULL,&thread_para);
if(NULL == init_ath8809 )
{
return -1;
}
return 0;
}
- IO口模拟I2C收发信息
- ZigBee 用IO口模拟I2C驱动程序
- STM32 IO口模拟I2C+驱动MPU6050
- IO模拟I2C代码
- io模拟i2c程序
- IO模拟I2C
- 51单片机IO模拟I2C
- STM32 IO 模拟IIC I2C
- 普通IO模拟i2c总线
- S5PV210 Linux -- IO口模拟I2C总线驱动
- linux下IO口模拟I2C的一些总结
- 普通IO口模拟实现I2C通信及应用解析
- 笔记四:linux下IO口模拟实现I2C协议
- 使用通用IO端口模拟I2C总线
- gec210 i2c程序io模拟方式实现
- 基于S5pv210--IO口模拟I2C总线Linux系统下驱动设计
- PIC单片机-普通IO口模拟I2C总线对24C02进行读写操作
- 信息收发
- 移动团队内部BUG数减少的管理
- Error:A problem occurred configuring project ':app'.
- 三维空间中的几何变换-平移旋转缩放
- Linux连接投影仪 (解决无法正常显示的问题)
- eclipse打开选中文件(文件夹,包)的当前目录
- IO口模拟I2C收发信息
- DSP连接仿真器的惨痛经历
- 欢迎使用CSDN-markdown编辑器
- Swift开发之 as、as!、as?三种类型转换操作符使用详解
- 写作建议
- usb mtp激活流程
- FB_VISUAL_XXXXX-------色彩模式宏
- 前端怎么提高自身
- excel清单数据导入到开票软件中进行开票