使用面向對象的方式來實現IIC驅動程序

一起學嵌入式 2023-06-30 07:50

掃描關注一起學嵌入式,一起學習,一起成長

一. 簡述

使用面向對象的編程思想封裝IIC驅動,將IIC的屬性和操作封裝成一個庫,在需要創建一個IIC設備時只需要實例化一個IIC對象即可,本文是基于STM32和HAL庫做進一步封裝的。

底層驅動方法不重要,封裝的思想很重要。在完成對IIC驅動的封裝之后借助繼承特性實現AT24C64存儲器的驅動開發,仍使用面向對象的思想封裝AT24C64驅動。

二. IIC驅動面向對象封裝

iic.h頭文件主要是類模板的定義,具體如下:

//定義IIC類
typedef?struct?IIC_Type
{

???//屬性
???GPIO_TypeDef??*GPIOx_SCL;??//GPIO_SCL所屬的GPIO組(如:GPIOA)
???GPIO_TypeDef??*GPIOx_SDA;??//GPIO_SDA所屬的GPIO組(如:GPIOA)
???uint32_t?GPIO_SCL;?????//GPIO_SCL的IO引腳(如:GPIO_PIN_0)
???uint32_t?GPIO_SDA;?????//GPIO_SDA的IO引腳(如:GPIO_PIN_0)
???//操作
???void?(*IIC_Init)(const?struct IIC_Type*);????????//IIC_Init
???void?(*IIC_Start)(const?struct IIC_Type*);???????//IIC_Start
???void?(*IIC_Stop)(const?struct IIC_Type*);????????//IIC_Stop
???uint8_t?(*IIC_Wait_Ack)(const?struct IIC_Type*);????//IIC_Wait_ack,返回wait失敗或是成功
???void?(*IIC_Ack)(const?struct IIC_Type*);???????//IIC_Ack,IIC發送ACK信號
???void?(*IIC_NAck)(const?struct IIC_Type*);???????//IIC_NAck,IIC發送NACK信號
???void?(*IIC_Send_Byte)(const?struct IIC_Type*,uint8_t);???????//IIC_Send_Byte,入口參數為要發送的字節
???uint8_t?(*IIC_Read_Byte)(const?struct IIC_Type*,uint8_t);?????//IIC_Send_Byte,入口參數為是否要發送ACK信號
???void?(*delay_us)(uint32_t);??????????????//us延時
}IIC_TypeDef;


iic.c源文件主要是類模板具體操作函數的實現,具體如下:

//設置SDA為輸入模式
static?void?SDA_IN(const?struct IIC_Type*?IIC_Type_t)
{
??uint8_t?io_num?=?0;??//定義io Num號
??switch(IIC_Type_t->GPIO_SDA)
??{
???case?GPIO_PIN_0:
????io_num?=?0;
???break;
???case?GPIO_PIN_1:
????io_num?=?1;
???break;?
???case?GPIO_PIN_2:
????io_num?=?2;
???break;?
???case?GPIO_PIN_3:
????io_num?=?3;
???break;
???case?GPIO_PIN_4:
????io_num?=?4;
???break;?
????case?GPIO_PIN_5:
????io_num?=?5;
???break;?
???case?GPIO_PIN_6:
????io_num?=?6;
???break;?
???case?GPIO_PIN_7:
????io_num?=?7;
???break;
???case?GPIO_PIN_8:
????io_num?=?8;
???break;?
???case?GPIO_PIN_9:
????io_num?=?9;
???break;
???case?GPIO_PIN_10:
????io_num?=?10;
???break;
???case?GPIO_PIN_11:
????io_num?=?11;
???break;?
???case?GPIO_PIN_12:
????io_num?=?12;
???break;
???case?GPIO_PIN_13:
????io_num?=?13;
???break;
???case?GPIO_PIN_14:
????io_num?=?14;
???break;?
???case?GPIO_PIN_15:
????io_num?=?15;
???break;
??}
??IIC_Type_t->GPIOx_SDA->MODER&=~(3<<(io_num*2));?//將GPIOx_SDA->GPIO_SDA清零
??IIC_Type_t->GPIOx_SDA->MODER|=0<<(io_num*2);???//將GPIOx_SDA->GPIO_SDA設置為輸入模式
}

//設置SDA為輸出模式
static?void?SDA_OUT(const?struct IIC_Type*?IIC_Type_t)
{
??uint8_t?io_num?=?0;??//定義io Num號
??switch(IIC_Type_t->GPIO_SDA)
??{
???case?GPIO_PIN_0:
????io_num?=?0;
???break;
???case?GPIO_PIN_1:
????io_num?=?1;
???break;?
???case?GPIO_PIN_2:
????io_num?=?2;
???break;?
???case?GPIO_PIN_3:
????io_num?=?3;
???break;
???case?GPIO_PIN_4:
????io_num?=?4;
???break;?
????case?GPIO_PIN_5:
????io_num?=?5;
???break;?
???case?GPIO_PIN_6:
????io_num?=?6;
???break;?
???case?GPIO_PIN_7:
????io_num?=?7;
???break;
???case?GPIO_PIN_8:
????io_num?=?8;
???break;?
???case?GPIO_PIN_9:
????io_num?=?9;
???break;
???case?GPIO_PIN_10:
????io_num?=?10;
???break;
???case?GPIO_PIN_11:
????io_num?=?11;
???break;?
???case?GPIO_PIN_12:
????io_num?=?12;
???break;
???case?GPIO_PIN_13:
????io_num?=?13;
???break;
???case?GPIO_PIN_14:
????io_num?=?14;
???break;?
???case?GPIO_PIN_15:
????io_num?=?15;
???break;
??}
??IIC_Type_t->GPIOx_SDA->MODER&=~(3<<(io_num*2));?//將GPIOx_SDA->GPIO_SDA清零
??IIC_Type_t->GPIOx_SDA->MODER|=1<<(io_num*2);???//將GPIOx_SDA->GPIO_SDA設置為輸出模式
}
//設置SCL電平
static?void?IIC_SCL(const?struct IIC_Type*?IIC_Type_t,int?n)
{
??if(n?==?1)
??{
????HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SCL,IIC_Type_t->GPIO_SCL,GPIO_PIN_SET);?????//設置SCL為高電平
??}
??else{
????HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SCL,IIC_Type_t->GPIO_SCL,GPIO_PIN_RESET);?????//設置SCL為低電平
??}
}
//設置SDA電平
static?void?IIC_SDA(const?struct IIC_Type*?IIC_Type_t,int?n)
{
??if(n?==?1)
??{
????HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SDA,IIC_Type_t->GPIO_SDA,GPIO_PIN_SET);?????//設置SDA為高電平
??}
??else{
????HAL_GPIO_WritePin(IIC_Type_t->GPIOx_SDA,IIC_Type_t->GPIO_SDA,GPIO_PIN_RESET);?????//設置SDA為低電平
??}
}
//讀取SDA電平
static?uint8_t?READ_SDA(const?struct IIC_Type*?IIC_Type_t)
{
??return?HAL_GPIO_ReadPin(IIC_Type_t->GPIOx_SDA,IIC_Type_t->GPIO_SDA);??//讀取SDA電平
}
//IIC初始化
static?void?IIC_Init_t(const?struct IIC_Type*?IIC_Type_t)
{
??????GPIO_InitTypeDef GPIO_Initure;
????
???//根據GPIO組初始化GPIO時鐘
???if(IIC_Type_t->GPIOx_SCL?==?GPIOA?||?IIC_Type_t->GPIOx_SDA?==?GPIOA)
???{
?????__HAL_RCC_GPIOA_CLK_ENABLE();???//使能GPIOA時鐘
???}
???if(IIC_Type_t->GPIOx_SCL?==?GPIOB?||?IIC_Type_t->GPIOx_SDA?==?GPIOB)
???{
?????__HAL_RCC_GPIOB_CLK_ENABLE();???//使能GPIOB時鐘
???}
???if(IIC_Type_t->GPIOx_SCL?==?GPIOC?||?IIC_Type_t->GPIOx_SDA?==?GPIOC)
???{
?????__HAL_RCC_GPIOC_CLK_ENABLE();???//使能GPIOC時鐘
???}
???if(IIC_Type_t->GPIOx_SCL?==?GPIOD?||?IIC_Type_t->GPIOx_SDA?==?GPIOD)
???{
?????__HAL_RCC_GPIOD_CLK_ENABLE();???//使能GPIOD時鐘
???}
???if(IIC_Type_t->GPIOx_SCL?==?GPIOE?||?IIC_Type_t->GPIOx_SDA?==?GPIOE)
???{
?????__HAL_RCC_GPIOE_CLK_ENABLE();???//使能GPIOE時鐘
???}?
???if(IIC_Type_t->GPIOx_SCL?==?GPIOH?||?IIC_Type_t->GPIOx_SDA?==?GPIOH)
???{
?????__HAL_RCC_GPIOH_CLK_ENABLE();???//使能GPIOH時鐘
???}?????
???
?????//GPIO_SCL初始化設置
?????GPIO_Initure.Pin=IIC_Type_t->GPIO_SCL;
?????GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;??//推挽輸出
?????GPIO_Initure.Pull=GPIO_PULLUP;??????????//上拉
?????GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;????//快速
?????HAL_GPIO_Init(IIC_Type_t->GPIOx_SCL,&GPIO_Initure);
?????//GPIO_SDA初始化設置
?????GPIO_Initure.Pin=IIC_Type_t->GPIO_SDA;
?????GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;??//推挽輸出
?????GPIO_Initure.Pull=GPIO_PULLUP;??????????//上拉
?????GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;????//快速
?????HAL_GPIO_Init(IIC_Type_t->GPIOx_SDA,&GPIO_Initure);
?????
????????????//SCL與SDA的初始化均為高電平
??????IIC_SCL(IIC_Type_t,1);
???????IIC_SDA(IIC_Type_t,1);
}
//IIC Start
static?void?IIC_Start_t(const?struct IIC_Type*?IIC_Type_t)
{
??SDA_OUT(IIC_Type_t);??????//sda線輸出
??IIC_SDA(IIC_Type_t,1);??????
??IIC_SCL(IIC_Type_t,1);
??IIC_Type_t->delay_us(4);
???IIC_SDA(IIC_Type_t,0);??//START:when CLK is high,DATA change form high to low?
??IIC_Type_t->delay_us(4);
??IIC_SCL(IIC_Type_t,0);??//鉗住I2C總線,準備發送或接收數據?
}
//IIC Stop
static?void?IIC_Stop_t(const?struct IIC_Type*?IIC_Type_t)
{
??SDA_OUT(IIC_Type_t);?//sda線輸出
??IIC_SCL(IIC_Type_t,0);
??IIC_SDA(IIC_Type_t,0);?//STOP:when CLK is high DATA change form low to high
???IIC_Type_t->delay_us(4);
??IIC_SCL(IIC_Type_t,1);?
??IIC_SDA(IIC_Type_t,1);?//發送I2C總線結束信號
??IIC_Type_t->delay_us(4);?
}
//IIC_Wait_ack?返回HAL_OK表示wait成功,返回HAL_ERROR表示wait失敗
static?uint8_t?IIC_Wait_Ack_t(const?struct IIC_Type*?IIC_Type_t)???//IIC_Wait_ack,返回wait失敗或是成功
{
??uint8_t?ucErrTime?=?0;
??SDA_IN(IIC_Type_t);??????//SDA設置為輸入??
??IIC_SDA(IIC_Type_t,1);IIC_Type_t->delay_us(1);???
??IIC_SCL(IIC_Type_t,1);IIC_Type_t->delay_us(1);
??while(READ_SDA(IIC_Type_t))
??{
????ucErrTime++;
????if(ucErrTime>250)
????{
??????IIC_Type_t->IIC_Stop(IIC_Type_t);
??????return?HAL_ERROR;
????}
??}
??IIC_SCL(IIC_Type_t,0);//時鐘輸出0?????
??return?HAL_OK;??
}
//產生ACK應答
static?void?IIC_Ack_t(const?struct IIC_Type*?IIC_Type_t)??????
{
??IIC_SCL(IIC_Type_t,0);
??SDA_OUT(IIC_Type_t);
??IIC_SDA(IIC_Type_t,0);
??IIC_Type_t->delay_us(2);??
??IIC_SCL(IIC_Type_t,1);
??IIC_Type_t->delay_us(2);??
??IIC_SCL(IIC_Type_t,0);
}
//產生NACK應答
static?void?IIC_NAck_t(const?struct IIC_Type*?IIC_Type_t)??????
{
??IIC_SCL(IIC_Type_t,0);
??SDA_OUT(IIC_Type_t);
??IIC_SDA(IIC_Type_t,1);
??IIC_Type_t->delay_us(2);??
??IIC_SCL(IIC_Type_t,1);
??IIC_Type_t->delay_us(2);??
??IIC_SCL(IIC_Type_t,0);
}
//IIC_Send_Byte,入口參數為要發送的字節
static?void?IIC_Send_Byte_t(const?struct IIC_Type*?IIC_Type_t,uint8_t?txd)?????
{
?????uint8_t?t?=?0;???
?????SDA_OUT(IIC_Type_t);??????
?????IIC_SCL(IIC_Type_t,0);//拉低時鐘開始數據傳輸
?????for(t=0;t<8;t++)
?????{??????????????
??????????IIC_SDA(IIC_Type_t,(txd&0x80)>>7);
??????????txd?<<=?1;????
???????IIC_Type_t->delay_us(2);?????//對TEA5767這三個延時都是必須的
???????IIC_SCL(IIC_Type_t,1);
???????IIC_Type_t->delay_us(2);??
???????IIC_SCL(IIC_Type_t,0);?
???????IIC_Type_t->delay_us(2);??
?????}??
}
//IIC_Send_Byte,入口參數為是否要發送ACK信號
static?uint8_t?IIC_Read_Byte_t(const?struct IIC_Type*?IIC_Type_t,uint8_t?ack)?????
{
???uint8_t?i,receive?=?0;
???SDA_IN(IIC_Type_t);//SDA設置為輸入
???for(i=0;i<8;i++?)
???{
??????IIC_SCL(IIC_Type_t,0);?
??????IIC_Type_t->delay_us(2);
??????IIC_SCL(IIC_Type_t,1);
??????receive<<=1;
??????if(READ_SDA(IIC_Type_t))receive++;???
??????IIC_Type_t->delay_us(1);
???}??????
??if?(!ack)
?????????IIC_Type_t->IIC_NAck(IIC_Type_t);//發送nACK
??else
?????????IIC_Type_t->IIC_Ack(IIC_Type_t);?//發送ACK???
??return?receive;
}
//實例化一個IIC1外設,相當于一個結構體變量,可以直接在其他文件中使用
IIC_TypeDef IIC1?=?{
??.GPIOx_SCL?=?GPIOA,???//GPIO組為GPIOA
??.GPIOx_SDA?=?GPIOA,???//GPIO組為GPIOA
??.GPIO_SCL?=?GPIO_PIN_5,???//GPIO為PIN5
??.GPIO_SDA?=?GPIO_PIN_6,??//GPIO為PIN6
??.IIC_Init?=?IIC_Init_t,
??.IIC_Start?=?IIC_Start_t,
??.IIC_Stop?=?IIC_Stop_t,
??.IIC_Wait_Ack?=?IIC_Wait_Ack_t,
??.IIC_Ack?=?IIC_Ack_t,
??.IIC_NAck?=?IIC_NAck_t,
??.IIC_Send_Byte?=?IIC_Send_Byte_t,
??.IIC_Read_Byte?=?IIC_Read_Byte_t,
??.delay_us?=?delay_us?????//需自己外部實現delay_us函數
};
上述就是IIC驅動的封裝,由于沒有應用場景暫不測試其實用性,待下面ATC64的驅動縫縫扎黃寫完之后一起測試使用。

三. ATC64XX驅動封裝實現

at24cxx.h頭文件主要是類模板的定義,具體如下:

//?以下是共定義個具體容量存儲器的容量
#define?AT24C01??127
#define?AT24C02??255
#define?AT24C04??511
#define?AT24C08??1023
#define?AT24C16??2047
#define?AT24C32??4095
#define?AT24C64???8191?????????//8KBytes
#define?AT24C128 16383
#define?AT24C256 32767??

//定義AT24CXX類
typedef?struct?AT24CXX_Type
{

??//屬性
??u32 EEP_TYPE;???????????//存儲器類型(存儲器容量)
??//操作
??IIC_TypeDef IIC;???????//IIC驅動
??uint8_t?(*AT24CXX_ReadOneByte)(const?struct AT24CXX_Type*,uint16_t);??//指定地址讀取一個字節
??void?(*AT24CXX_WriteOneByte)(const?struct AT24CXX_Type*,uint16_t,uint8_t);?//指定地址寫入一個字節
??void?(*AT24CXX_WriteLenByte)(uint16_t,uint32_t,uint8_t);?//指定地址開始寫入指定長度的數據
??uint32_t?(*AT24CXX_ReadLenByte)(uint16_t,uint8_t);???//指定地址開始讀取指定長度數據
??void?(*AT24CXX_Write)(uint16_t,uint8_t?*,uint16_t);??//指定地址開始寫入指定長度的數據
??void?(*AT24CXX_Read)(uint16_t,uint8_t?*,uint16_t);???//指定地址開始寫入指定長度的數據
??void?(*AT24CXX_Init)(const?struct AT24CXX_Type*);?//初始化IIC
??uint8_t?(*AT24CXX_Check)(const?struct AT24CXX_Type*);???//檢查器件
}AT24CXX_TypeDef;

extern?AT24CXX_TypeDef AT24C_64;?????//外部聲明實例化AT24CXX對象


at24cxx.c源文件主要是類模板具體操作函數的實現,具體如下:

//在AT24CXX指定地址讀出一個數據
//ReadAddr:開始讀數的地址??
//返回值??:讀到的數據
static?uint8_t?AT24CXX_ReadOneByte_t(const?struct AT24CXX_Type*?AT24CXX_Type_t,uint16_t?ReadAddr)
{??????
??uint8_t?temp=0;??????????????????????????
??AT24CXX_Type_t->IIC.IIC_Start(&AT24CXX_Type_t->IIC);??
??//根據AT的型號發送不同的地址
??if(AT24CXX_Type_t->EEP_TYPE?>?AT24C16)
??{
????AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,0XA0);????//發送寫命令
????AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);
????AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,ReadAddr>>8);//發送高地址?????
??}else?AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,0XA0+((ReadAddr/256)<<1));???//發送器件地址0XA0,寫數據
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);?
??AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,ReadAddr%256);???//發送低地址
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);?????
??AT24CXX_Type_t->IIC.IIC_Start(&AT24CXX_Type_t->IIC);????????
??AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,0XA1);???????????//進入接收模式??????
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);??
??temp=AT24CXX_Type_t->IIC.IIC_Read_Byte(&AT24CXX_Type_t->IIC,0);?????
??AT24CXX_Type_t->IIC.IIC_Stop(&AT24CXX_Type_t->IIC);//產生一個停止條件?????
??return?temp;
}
//在AT24CXX指定地址寫入一個數據
//WriteAddr??:寫入數據的目的地址????
//DataToWrite:要寫入的數據
static?void?AT24CXX_WriteOneByte_t(const?struct AT24CXX_Type*?AT24CXX_Type_t,uint16_t?WriteAddr,uint8_t?DataToWrite)
{????????????????????????????????
???AT24CXX_Type_t->IIC.IIC_Start(&AT24CXX_Type_t->IIC);???
??if(AT24CXX_Type_t->EEP_TYPE?>?AT24C16)
??{
????AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,0XA0);????//發送寫命令
????AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);
????AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,WriteAddr>>8);//發送高地址?????
??}else?AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,0XA0+((WriteAddr/256)<<1));???//發送器件地址0XA0,寫數據?????
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);?
???AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,WriteAddr%256);???//發送低地址
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);???????????????
??AT24CXX_Type_t->IIC.IIC_Send_Byte(&AT24CXX_Type_t->IIC,DataToWrite);?????//發送字節??????????
??AT24CXX_Type_t->IIC.IIC_Wait_Ack(&AT24CXX_Type_t->IIC);????????????
???AT24CXX_Type_t->IIC.IIC_Stop(&AT24CXX_Type_t->IIC);//產生一個停止條件?
?AT24CXX_Type_t->IIC.delay_us(10000);??
}
//在AT24CXX里面的指定地址開始寫入長度為Len的數據
//該函數用于寫入16bit或者32bit的數據.
//WriteAddr??:開始寫入的地址??
//DataToWrite:數據數組首地址
//Len????????:要寫入數據的長度2,4
static?void?AT24CXX_WriteLenByte_t(uint16_t?WriteAddr,uint32_t?DataToWrite,uint8_t?Len)
{???
??uint8_t?t;
??for(t=0;t??{
????AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
??}????????????????
}
//在AT24CXX里面的指定地址開始讀出長度為Len的數據
//該函數用于讀出16bit或者32bit的數據.
//ReadAddr???:開始讀出的地址?
//返回值?????:數據
//Len????????:要讀出數據的長度2,4
static?uint32_t?AT24CXX_ReadLenByte_t(uint16_t?ReadAddr,uint8_t?Len)
{???
??uint8_t?t;
??uint32_t?temp=0;
??for(t=0;t??{
????temp<<=8;
?????temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);??????????
??}
??return?temp;????????????????
}
//在AT24CXX里面的指定地址開始寫入指定個數的數據
//WriteAddr?:開始寫入的地址?對24c64為0~8191
//pBuffer???:數據數組首地址
//NumToWrite:要寫入數據的個數
static?void?AT24CXX_Write_t(uint16_t?WriteAddr,uint8_t?*pBuffer,uint16_t?NumToWrite)
{
??while(NumToWrite--)
??{
???AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
????WriteAddr++;
????pBuffer++;
??}
}
//在AT24CXX里面的指定地址開始讀出指定個數的數據
//ReadAddr?:開始讀出的地址?對24c64為0~8191
//pBuffer??:數據數組首地址
//NumToRead:要讀出數據的個數
static?void?AT24CXX_Read_t(uint16_t?ReadAddr,uint8_t?*pBuffer,uint16_t?NumToRead)
{
??while(NumToRead)
??{
????*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);?
????NumToRead--;
??}
}?
//初始化IIC接口
static?void?AT24CXX_Init_t(const?struct AT24CXX_Type*?AT24CXX_Type_t)
{
??AT24CXX_Type_t->IIC.IIC_Init(&AT24CXX_Type_t->IIC);//IIC初始化
}
//檢查器件,返回0表示檢測成功,返回1表示檢測失敗
static?uint8_t?AT24CXX_Check_t(const?struct AT24CXX_Type*?AT24CXX_Type_t)???
{
?uint8_t?temp;
??temp?=?AT24CXX_Type_t->AT24CXX_ReadOneByte(AT24CXX_Type_t,AT24CXX_Type_t->EEP_TYPE);//避免每次開機都寫AT24CXX??????
??if(temp?==?0X33)return?0;?????
??else//排除第一次初始化的情況
??{
??????AT24CXX_Type_t->AT24CXX_WriteOneByte(AT24CXX_Type_t,AT24CXX_Type_t->EEP_TYPE,0X33);
???????temp?=?AT24CXX_Type_t->AT24CXX_ReadOneByte(AT24CXX_Type_t,AT24CXX_Type_t->EEP_TYPE);
??????if(temp==0X33)return?0;
??}
??return?1;??
}
//實例化AT24CXX對象
AT24CXX_TypeDef AT24C_64={
?.EEP_TYPE?=?AT24C64,???????????//存儲器類型(存儲器容量)
?//操作
?.IIC={
??.GPIOx_SCL?=?GPIOA,
??.GPIOx_SDA?=?GPIOA,
??.GPIO_SCL?=?GPIO_PIN_5,
??.GPIO_SDA?=?GPIO_PIN_6,
??.IIC_Init?=?IIC_Init_t,
??.IIC_Start?=?IIC_Start_t,
??.IIC_Stop?=?IIC_Stop_t,
??.IIC_Wait_Ack?=?IIC_Wait_Ack_t,
??.IIC_Ack?=?IIC_Ack_t,
??.IIC_NAck?=?IIC_NAck_t,
??.IIC_Send_Byte?=?IIC_Send_Byte_t,
??.IIC_Read_Byte?=?IIC_Read_Byte_t,
??.delay_us?=?delay_us
?},???????????????????//IIC驅動
?.AT24CXX_ReadOneByte?=?AT24CXX_ReadOneByte_t,??//指定地址讀取一個字節
?.AT24CXX_WriteOneByte?=?AT24CXX_WriteOneByte_t,//指定地址寫入一個字節
?.AT24CXX_WriteLenByte?=?AT24CXX_WriteLenByte_t,?//指定地址開始寫入指定長度的數據
?.AT24CXX_ReadLenByte?=?AT24CXX_ReadLenByte_t,???//指定地址開始讀取指定長度數據
?.AT24CXX_Write?=?AT24CXX_Write_t,??//指定地址開始寫入指定長度的數據
?.AT24CXX_Read?=?AT24CXX_Read_t,???//指定地址開始讀取指定長度的數據
?.AT24CXX_Init?=?AT24CXX_Init_t,?//初始化IIC
?.AT24CXX_Check?=?AT24CXX_Check_t???//檢查器件
};
簡單分析:可以看出AT24CXX類中包含了IIC類的成員對象,這是一種包含關系,因為沒有屬性上的一致性因此談不上繼承。

之所以將IIC的類對象作為AT24CXX類的成員是因為AT24CXX的實現需要調用IIC的成員方法,IIC相當于AT24CXX更下層的驅動,因此采用包含關系更合適。

因此我們在使用AT24CXX的時候只需要實例化AT24CXX類對象就行了,因為IIC包含在AT24CXX類中間,因此不需要實例化IIC類對象,對外提供了較好的封裝接口。下面我們看具體的調用方法。

四. 主函數main調用測試

在main函數中直接使用AT24C_64來完成所有操作,下面結合代碼來看:

#include?"at24cxx.h"????//為了確定AT24C_64的成員方法和引用操作對象AT24C_64
int?main(void)
{
??/************省略其他初始化工作****************/
??//第一步:調用對象初始化方法來初始化AT24C64
??AT24C_64.AT24CXX_Init(&AT24C_64);
??//第二步:調用對象檢測方法來檢測AT24C64 ??????????
??if(AT24C_64.AT24CXX_Check(&AT24C_64)?==?0)
??{
????printf("AT24C64檢測成功\r\n");
??}
??else{
????printf("AT24C64檢測失敗\r\n");
??}
??return?0;
}
可以看出所有的操作都是通過AT24C_64對象調用完成的,在我們初始化好AT24C_64對象之后就可以放心大膽的調用其成員方法,這樣封裝的好處就是一個設備對外只提供一個對象接口,簡潔明了。

五. 總結

本文詳細介紹了面向對象方法實現IIC驅動封裝以及AT24CXX存儲器的封裝,最終對外僅提供一個操作對象接口,大大提高了代碼的復用性以及封裝性。

文章來源于網絡,版權歸原作者所有,如有侵權,請聯系刪除。



個人微信開放,掃碼添加,進高質量嵌入式交流群


關注我【一起學嵌入式】,一起學習,一起成長。


覺得文章不錯,點擊“分享”、“”、“在看” 唄!

一起學嵌入式 公眾號【一起學嵌入式】,RTOS、Linux編程、C/C++,以及經驗分享、行業資訊、物聯網等技術知
評論
  • 做儲能項目,你是怎么選控制器的?隨著工商業儲能、電網側儲能的規模化落地,作為儲能EMS“大腦”的嵌入式控制器,直接決定了整套系統的運行穩定性、數據可靠性與項目落地效率。不少從業者都踩過類似的坑:接口數量不足要額外加裝擴展模塊、戶外高溫導致設備宕機、電磁干擾引發數據丟包、軟件生態薄弱拖慢開發周期……選對儲能控制器,核心要盯準四個關鍵維度。首先看接口能力:全鏈路覆蓋,才是降本的核心。一套完整的儲能系統,需要同時對接PCS、BMS、智能電表、溫濕度傳感器、除濕機、煙感消防主機,還要連接急停開關、斷路器
    飛凌嵌入式 2026-08-11 08:46 216瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 524瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質譜等實驗中,真正需要測量的信號往往只出現在一個很短的時間窗口內,卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩定重復的微弱脈沖與瞬態信號,賽恩科儀為OE2052雙通道數字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 44603瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 摘要東莞市恒創連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發。公司面向工業自動化、新能源儲能、BMS、汽車電子、AI服務器、GPU供電、通信設備、醫療設備和智能家居等場景,提供從產品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產替代評估。常見替
    HC003 2026-08-07 10:14 264瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 214瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 424瀏覽
  • 一、方案簡介在Buildroot構建的嵌入式Linux系統中部署Flutter應用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現渲染,無需依賴桌面環境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 246瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創知音語音芯片 2026-08-07 14:44 261瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產業園區里,暖通空調運行著廠商私有協議,照明系統遵循專屬通信標準,變配電、門禁安防各成體系——設備間數據壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發,不僅成本高企,交付周期也難以管控。這就是樓宇自控行業多年的痛點:協議林立、封閉林立。而破局的鑰匙,早在30多年前就已經寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協議,BACnet是如今全球樓宇自控系統(BAS)互聯互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 300瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 572瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 228473瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 376瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 《需要爸爸播种子》电影免费在线观看,高清完整版美国倫理片_努努影院 | 喜爱夜蒲快播观看| 我的老婆是大佬3国语| 星克莱尔《迷宫》在线观看 | 和讨厌的前任一起去差旅| 哪吒2之魔童闹海| 咒怨 白老妇| 我的姐妹免费观看| 李敖 刘家昌| 地狱洞电影完整版在线观看| 360大佬爱上我4季全集免费看| 裁判文书官方网| 花样年华在线观看| 埃及皇后3满天星版| 中国百强名镇| 猎战狂徒电影| 女教师动漫全集ova无修| 私密按摩师电影免费完整版| 色莱芜视频在线| 李昊石被立案调查| 《后宫·甄嬛传》| over flow第一季在线观看翻译| 神探夏洛克电影| 跟部长出差电影| 情难断原唱| 潍坊军训吊带| 女超人法国版在线观看| 洗冤录1国语高清在线观看免费| 詹俊英超精华| 非洲黑人噼里啪啦视频免费看… | 同志电影在线观看| 火线警告第三季| 十九岁观看免费高清完整版| 单月大减4万亿存款都流向哪儿了?| 琪琪电影网午夜理论片717西瓜| 《爱我几何》完整版在线观看电影| 火影忍者之路| 打开腿让我尝尝你的味道是什么歌| 女销售楼的秘密| 潘晓婷教你打台球| 牙医姐妹在线观看视频全集| 天龙八部 电影| 遇见王沥川40集完整版| 新有菜| 夏夜韩剧在线播放| 暴躁46集全全免费播放| 公主骑士是蛮族的新娘全集观看| 慢性折磨呕吐室 主要讲述| 美景之屋6普通话版百度云| 茶啊二中第四季| 私人航空完整版在线播放| 龙与地下城3:魔神降临| 龙珠z国语版| 《少女》2电影| 宝贝女孩电影免费观看完整版高清 | 动漫烟花| 畀女一起愁愁在线观看免费播放| 捷德奥特曼中文版全集免费观看| 时光与你别来无恙电视剧免费观看| 偷偷藏不住46集初吻| 天真有牙| 同学的妈妈韩国| 我的妈妈日语| 黑狐电视剧免费全集在线观看| z 108弃城| 神探夏洛克第四季第三集下载 | 49ai| 民国奇探西瓜免费观看| 桓台县| 红蔷薇剧情介绍| 1986牙医姐妹赤子板栗手机免费| 尖叫之夜免费观看2023年电影| 侏罗纪世界3免费观看完整版| 帅飘全集| 纯情罗曼史第一季02| 高清《开始捉迷藏 第二季》 | 义姐是不是良喂养樱花在线观看 | 姐妹牙医1986日剧未删减版电影| 跳水世锦赛女子十米台决赛直播| 纵情欲海3迅雷下载| 名侦探柯南564| 我的董事长老婆| 女超人麦乐迪在线视频| 快17电影网| 听风者电视剧| 海天盛筵haobc| 《需要爸爸播种子》在线观看播放_HD/高清_免费无删减完整版电影 - 星辰影院 | 星期五的寝室| 《小舍得》免费高清在线观看完整版 | 男双乒乓球决赛结果| 甜蜜蜜在线观看电视剧免费| 女帝归来:美男通通闪开短剧全集| 3对1:2人一次性体检4| 最美情侣在线播放观看| 魔力宝贝监狱 电影| 乌克兰基辅实时画面| 世界第一初恋oad| 《双女任务》完整版电影| 三生缘起是清欢| 哇嘎电影免费观看国语高清 | 新还君明珠| 人到中年电视剧全集| 韩国电影修理工的艳遇| 法证先锋6电视剧全集在线观看| 男按摩师三级在线看| 新凯莱最新消息| 穿越火线在线观看免费完整版| 昼颜 电影| 雅的拼音| 荒野渔夫高清免费观看| 学姐知道 电视剧| 坎贝奇三部曲无憾在线| 回复术士第2季在线观看| 四少妇按摩记在线观看观| 广州百万葵园| 我在北京挺好的| 古惑仔:江湖新秩序| 香烟爱上火柴dj| 动感之星小玲256集免费观看| 在线观看神雕侠侣| 奶头按摩电影| 高清《流动资产》电影| 麦乐迪《女超人》电影| 电影恶行之外| 姐姐真漂亮4韩剧免费观看| 敢死队1在线观看| 百练成仙| 念念不忘短剧| 乡村爱情17在线观看免费版| 黑白配1080完整版在线观看 | 没想到儿子的竟然那么大| 马克斯·维斯塔潘:新征途电视剧| 拜托小姐 国语| 范冰冰 电影| 地狱之路| 天使在线| 板栗电影| 电影《女校长》完整版| 美容院:待遇服务4| 泡沫爱情电视剧| 日本电影《律师坠落》演员表| 冯巩个人简历简介| 法国空乘5免费高清原声满天星美版| 茶啊二中电影| 《黏糊糊的你》| 情欲在线| 电影杀手之王| 舞蹈红月亮| 新妹魔王的契约者在线观看| 美食的俘虏125| 喝毛尖的好处| 朋友换娶妻2完整版| 凡人修仙传电视剧免费观看| 时间静止器电影免费观看完整版| 四月一日灵异事件簿·继动漫| 斯巴达第四季完整版在线播放| 湘北小成| 电影绝命速递| 黄色仓库| 最近好看的免费电影| 爱我几何免费观看| 短剧《炽热吸引》免费观看| 歼灭天际线高清免费观看完整版| 电视剧爱情男女| 三年成全主演名单| 大神同学想被吃掉未增删有翻译| 需要爸爸播种美国电影| 梅西疑似脚踝隆起大包| 新生电影| 精油按摩韩剧| 机械哥斯拉| 汪汪队立大功动画全集| 侏罗纪世纪| 安娜德阿玛斯| 年轻人电影在线观看| 满洲里市| 精绝古城 下载| 电影《美容院的特殊待遇》纹身男演 | 激战后厨1至5外出| 秦总夫人| 安姨在线观看全集| 七十七封阵亡通知书| 年轻的继拇 主演| 夜半歌声免费| 禁片电影在线观看| 2对2交换| 漂亮的姐姐在线播放| 外出2005原版时长| 爱上黑道女| 玉浦团电影在线观看| 打脸拜金女全集免费| 熊出没逆转时空正片| 夜色暗涌| 电视剧今生有你全集免费观看| 一村之长电视剧| 侵略!乌贼娘| 前田香织种子| 关中枪声电视剧| 打工仔的梦想房sp| 映山红简谱| 匆匆那年在线观看| 枪神传说| 骨语2电视剧免费观看全集| 卧虎藏龙 电影| 仁心解码2粤语优酷| 三叶草免费观看高清电视剧| 爱的躯壳 下载| 命悬一线的浪漫| 马公市| 长相思2在线观看| 公之浮之手电影免费播放完整版 | 密绝1950| 掌中之物西班牙版本无删减| 高清年少有为未删减| 美国版5娃娃脸| 和社长一起去出差旅行的日子中文版| 渔夫荒野正版免费观看 | 人骨拼图| 《法国空乘10》观看| 极寒之城电影完整版免费观看| 爱我几何150分钟完整电影在线观看完 | 秘密爱韩国电影完整版免费观看| 大男人的小胶妻| 第22条婚规全集在线观看| 追凶者也 电影| 切小金家的旅馆| 乘龙怪婿粤语| 韩国x档案| 千山暮雪第一集| 老公万岁粤语| 密室大逃脱大神版超前聚会| 狂飙电视剧40集在线观看免费狂飙| 敢死队全集| 异形2在线观看完整版免费高清| 白鹿原全集免费版视频| 皖乡食妹| 七天 2007 电影| 《小欢喜》电视剧| 姐姐真漂亮高清免费观看| 美国蜜桃在线| 桃恋者全集观看| 赛仑《渔夫的妻子》| 碧海雄心| 女生男生一起愁愁愁视频| 电视剧时尚女编辑| 女特工风云满天星| 麻将电影| 瓦噶黄色电影| 希崎杰西卡 空姐| 男女一起愁愁愁视频在线观看| 峡谷在线观看高清完整| 游樣3| 寒武纪免费观看在线观看完整版| 水卜樱第一季剧情图解大全| 东京异种 电影| 按摩推油按摩极品电影| 悬崖之上免费| 爱丫爱丫高清免费观看电视剧| 爱逢时短剧免费播放| 电影美乃雀主演在线观看| 无可奈何| 《法国瑜伽》免费观看中文版| 彼得格里尔的贤者时间第一季| 新还珠格格全集| jojo奇妙冒险星尘斗士| 圣女贞德电影| 奈奈和熏| 新文件夹建2| 萌萌侵略者| 大嫁风尚电视剧| 凯·帕克的经典1984第6| 不是我不爱你歌词| 猛虎震地| 大江大河第三部免费播放| 特殊的治疗2李采潭主演是谁| 窃听风云3| 初体验| 末班车后胶囊旅馆| 《需要爸爸播种子》HD高清完整版在线观看 - 热门电影播放 - 优看影选网 | 戴拿奥特曼免费观看| 鬼灭之刃九柱训练篇免费观看| 傻女闯艺界| 桃花在线观看免费高清电视剧98| 黑暗荣耀第二季在线播放| 《指尖传出的温度》| 打黑风暴在线观看| 绝地出击 电视剧全集| 挑情宝鉴| 电视剧.三大队| 银河奥特曼7| 绝对权力剧情| 法国满天星女飞行员1982年上映时间| 《笼中鸟》完整版| 丰胸乳房按摩电影| 欢乐颂5最新免费观看高清电视剧| 女销售员2的销售秘密| 失忆的劳拉电影| 灭火宝贝4美版法国航空| 瘦身男女粤语| 女版战狼6全集免费看| 隋唐英雄82| 岳开始疯狂需要| 入室奷贞洁美妇小说| 零度触碰12集| 韩国朋友的妈妈2| 三年高清免费观看国语| 卖百科全书的女人电影完整版| 韩国萌娃| 需要爸爸播种美国2024年几月几号开播| 神勇双响炮国语| 古墓丽影(法国版)女版| 邻居的妻子在线观看| 妈妈的职业2完整版结局在线看中字| ママぷりっ!?| 保罗芭芭拉3| 漠风吟电视剧在线观看| 曲阳县| 信仰电视剧在线观看全集免费| 漂亮的保姆6完整版中文| 紫钗奇缘26| 梦想的声音 综艺| 动画模拟东部战区联合打击| 韩剧要帅气的生活| 阿拉伯电影绝色在线观看免费| 亮剑李幼斌版| 八尺夫人满天星| 一起来看流星雨电视剧免费全集| 大侦探福尔摩斯| 渔夫荒野史记在线播放| 绅士和小姐| 法国空姐2019满天星法版:星辉照耀下的职业光芒中文版 | 黑白配高清国语在线播放| 黄河大侠电影| 日剧维修工的艳遇| 小火车托马斯| 五十度灰在线未删减在线观看| 十五的月亮原唱| 芳华在线观看| 在线爱苍井空| 神奇宝贝bw110| 《恋雪纪》完整版免费看 | 战狼6电影在线观看免费版高清| 汉末皇叔| 妻子8| 小小竹排江中游| 学生在线观看| 孤身在线观看高清完整版免费| 筋疲力尽| 苏文茂相声| 面朝大海春暖花开赏析| 3v1三人一次性体检韩国电影| 上门赘婿:老婆我超有钱短剧全集| 《高压监狱2》法国版| 超级艳遇| 连南| 箭侠电视剧| 大公教育| 乡村小媳妇全集免费| 《斗罗大陆》.免费观看| 《部长夫人的美貌》的日剧叫什么 | 与狼共舞全集| 需要爸爸播种子-在线追剧| 魔神英雄传| 二十世纪性格与X爱情观后感免费观看 | 程多闻副教授离世| 《炸天小姐》电影观看 | 猎钻缉凶电影在线观看完整版高清| 宜阳县| 鞠婧祎免费造梦在线观看| 宇宙巡警露露子| 痛欲 电影| 时光代理人第四集| 美式家庭忌讳1-| 真性假爱在线观看| 巴以冲突最新消息| 阳刚男孩读后感| 法国空姐满天星法版| 电影窗外| 读百科全书的女人看在线完整 | 僵尸道长2在线观看免费完整版| 三生三世十里桃花电视| 廖凡宿敌免费观看| 白峰电影高清无广告免费看| 报告老板之豪言壮旅04| 工地上的女人免费观看电视剧| 乌海电影在线观看完整版免费| 保罗一家1--4美国版| rio 全集| 星辰变第三季免费全集电视剧| 四喜一共多少集| 爱情男女全集免费观看免费| 撸二哥男人在线网站观看| 一生一世在线观看| 丫头 5| 仙女湖免费观看电视剧全集| 金州疫情| 长相思第一季全集免费完整版16| 韩国电影 爱人 下载| 满天星电影免费观看高清在线播放| 韩剧国语爱在何方| 5帕克禁忌| 聊斋艳谈之灯草和尚| GQ盛典2023直播回放| 《侏罗纪4:重生》免费观看| 超级司机凌杰| 美版女儿国在线观看完整版| 女子当众撩衣给男友喂NAI| 1—5集免费普通话版金| 量子沙盘| 疯狂啦啦队完整版| 不能错过的只有你电影免费观看完整| 兵哥哥GSW| 高压监狱3法国完整版免费| 兽人免费观看完整版| yellow视频在线观看| 姐妹4在线观看完整版中文| 女孩不平凡电影| 长相思第二季电视剧免费完整版| 掉了伴奏| 屠宰场呕吐娃娃电影在线观看免费| 新三国全部95集免费| 高压监狱伦理片| 欧美人 zooskool| 恒大亚冠决赛录像| 雾山五行第二季樱花动漫| 韩国电影妈妈的女儿| 木下檀檩子电影在线观看2023年上映时 | 大胸继拇特殊服务4| 《伪装者》全集免费高清在线观看| 轮到你了中文版| 韩国陷阱| 棋士电视剧免费观看| 电影《金悔瓶》徐少强叫什么名字就| 《少妇》6| 橄榄球的电影| 朋友麦子5的抵债之举中字| 高清《最长的一天》电影在线观看| 铃木杏里《少年爱》免费听| 电影流浪地球| 名欲场电影| 天堂口下载| 胜利事件牵扯明星| 《初恋时间》1-6全集免费观看| 新济公活佛下部| 早春二月免费| 麻辣变形计2| 女生腹泻未在意5天后心脏停跳| 天峻县| 中国高清观看免费观看| 如懿传全87集免费播放| 美姊妹剥赤板栗是哪一集| 我的父亲母亲电影完整版观看| 生死决裂秋瓷炫高清完整版| 好姐姐电影免费版在线看| 延安爱情在线观看| 画皮2011| 熊出没之环球大冒险1| 需要爸爸播种子-在线追剧| 白蛇1:白蛇缘起| 完美女人| 火线三兄弟高清全集| 被拒绝的爱泰剧免费播放全集| 伦理电影爸爸我要你的种子在线观看 | 《入室暴行3被蹂躏| 广场舞豆芽菜的爱| 爱的妇产科| 女超人法国版有字幕吗| 张响神枪电视剧全集| 意大利泰山HR版| 射雕英雄传94版粤语| 应召女郎的秘密日记| 《美容院:特殊待遇在线观看| 只是离婚的关系免费观看电视剧| 外卖特邀员免费| 黄秋生 人肉叉烧包| 猪猪侠之深海小英雄4| 做爱aj的电视剧大全免费观看中国国语 | 女版捉鬼敢死队满天星| 网球王子电视剧| 厚颜无耻韩国动漫观看免费| 张惠妹演唱会2013| 鲁豫有约周星驰| 17·3电影高清免费观看| 《爆弹》| b哥全集| 阿凡达在线看| 私じゃなかったんだね谐音 | 轻于鸿毛免费观看全集完整版电影| 妖艳女忍者传| 徐小凤经典歌曲| 图书馆里的女友免费观看全集完整版动漫第一季 | 圆桌派最新一季2024| 19岁电影完整版观看免费全集| 风水之王:改命转运第一人短剧全集 | 《镜的第三乐章》| 森林狼vs火箭| 木下檀檩子电影免费观看国语版大哥 | 赵丽颖眼睛发炎| 江南style金泫雅版| 大兵的寝室免费观看| 巴厘岛命案行凶动机公布| 费雪小姐探案集| 《黑土无言》电影免费观看| 老公从外地回来一晚上不让我睡觉| 状志凌云满天星无删减版| 哈尔滨着火| 风水相师断命:一眼定吉凶短剧全集 | 刀剑乱舞花丸第二季| 陈列之家| 新的哥哥2在线观看| 关中往事| 《法国空乘4》伦理HD| 海扁王2电影| 大侦探第8季在线观看免费版高清| 村枝普通话版| 企业强人粤语版免费观看| 电影特邀外卖员| 红字 韩国电影| 汉代风云人物之吕后| 美国另类69| 他偏爱我短剧免费观看全集| 《女生宿舍》2免费观看| 都市战神短剧全集| 金瓶双艳HD完整版| 电影《私人女性监狱》HD在线观看,高清完整版美国伦理片,伦理_OK电影天堂 | MANTA所有歌曲TOTAKKA HAYA KIRGUZUX| 喜爱夜蒲2字幕| 动漫《阿姨爱上我》续集免费观看| 疯狂小说家电影| 流星花园高清字幕版| 凯登克罗斯HD版高清播放电影| 事物的秘密在线观看| 非诚勿扰20120407| 隐形帽子电影完整版在线观看 | 海晏县| らぶりーあいなちゃ在线ん| 胜利事件牵扯明星| 女斯巴达2新开始在线观看免费下载| 高清砖墙谜攻未删减| 星期三第二季在线看免费观看 | 新白发魔女传大结局| 西藏锅庄| 东京塔之越南女兵俘虏| 九重紫电视连续剧免费看| 爱情填满空白第二季完整版| 斯巴达HR版| 黑夜终至电影| 斗罗大陆187集免费观看完整版 | 看了又看第三部| 八戒八戒10在线观看全集免费| 死亡救赎| 五号特工组1全集| 老泥妹| 第几次离开我dj| 斗罗大陆113| 女律师的堕落zaixianq| 可爱的妹妹| 阿童木国语| 《快车手》电影在线观看| 绝密飞行2| 奇怪的美容院2的完整演员表| 致命弯道4| 十分钟免费观看完整版电影| 我年轻的瘦子4()艺术片V| 年轻的阿姨5中字在线播放| 朱茵142分钟未删减版| 金银梅普通话版在线播放 | 圣堂风云剧情| 日本战狼双人6| 女老师3在线观看| 玉浦团2| 特种兵之火凤凰62| 桃色天使终极猎杀| 战狼6超清正片免费观看 | 《高压监狱2》法国| 可人儿成人社区| 飞驰人生2在线观看 | 电影《断金》| 年轻的朋友电影在线看| 杨春霞乱云飞| 怦然心动20岁 第四季| 广丰县| 少年钦差| 康熙密史| 卖保险套的女销售| 战斗之魂:少年激霸弹| 李德印42式太极剑| 金银瓶1-5hd手机版| 野花免费观看韩国电影| 午夜剧场色| 巜生殖按摩》| 超智能足球第二季| 不再说分手| 天海翼护士在线| 酒徒 温碧霞| 跑男第九季| 新婚和部长出差高清观看| 越战猎鹿人| 斧头帮音乐下载| 美屋之屋6| 一吻巴黎| 我唾弃你的坟墓3| 美国禁忌1年转一代| 翁与小莹十三部07章| 完美无瑕在线观看| 人猿泰山1995在线观看完整版| 蒙娜丽莎走下楼梯| 喜剧电影爆笑| XL司令在线观看完整版动漫 | 《维修工人的艳遇》中字| 傅佩荣详解易经64卦| 大叔我爱你电影| 台湾《小凤新婚下》在线观看| 李月华主演的电影在线看| 猿人星球纪录片| 金银悔5-1| 绿箭侠第三季| 七龙珠第一部| 男人和女人一起愁愁愁电视剧免费观op红楼梦| 高清《遇见你之前》电影| 天堂之囚电影完整版中文| 女子护卫队电影在线观看| 举起手来第二部| 惊声尖笑5下载| 艺校女学生滋味1~10| 肖申克的救赎 电影| 俞敏洪励志语录| 台湾《电影小凤新婚下》| 人间更胜九重天短剧全集免费看 | 丰满的邻居| 青春期失乐园全集| 百万新娘爱无悔| 妈妈的职业5观看全集免费| 无间道3电影| 花的勇气ppt| 饥饿的阿姆6高清版下载| 老板的妻子免费观看电视剧| 人妻女警官痴汉电车在线| 无欲不爱在线观看| 啄木鸟系列壮志凌云满天星女版演员| 电视剧珠光宝气| 恶灵骑士2在线看| 同学的妈妈中韩双字id贤宇| 尤里西斯的生命之旅| 密室大逃脱第三季免费观看完整版| 黛比浪漫女家教台剧在线观看| 阴阳美人棺电影免费国语高清| 南宁护士门迅雷下载| 公的浮之手中文字幕高清版| 小马宝莉第二季| 死亡笔记夜神月| 麻生香织和黑人无删减版观看| 夫妻成长日记下载| 无敌枪王电视剧全集| 飞机上性服务2免费播放| 村姑朵朵| 边防风暴| 维修工人的绝遇2中文版免费观看| 班级管理的原则| 站台电影| 芳芳郁金香| 甲种公牛在线观看| 《年轻的女仆》在线观看| 《姐弟恋》电影免费播放| 小少女性启蒙的电影有哪些| 闯关东电视连续剧全集免费观看剧情| 行尸走肉1| 动感之星小玲108集全集免费| 再战江湖国语高清| 花便当电影| 出差遇到垃圾前任电影完整版在线观看| 重案六组第四部优酷| 看春晚迎新春| 千金与佣人电影叫什么| 你好李焕英在线观看免费版| 红蔷薇剧情介绍| 友谊县| 姜子牙在线| 时光代理人第11集| 果盘先生| 渔民家姑娘2| 十七岁电影免费看| 中国老师在英国| 美国睫毛膏4| 一人之下第六季在线观看| 七夕潘甜甜牛郎织女资源| 《爱我几何》原版| 漂亮的保姆韩国剧| 韩国电影在线观看高清观看| 食物链无删减| 《售楼女王》朱莉安妮| 《迷案奇踪》电影| 还愿多少钱| 飘雪厨房激战| 争宠之妃位攻略短剧全集| 女朋友的妺妺HD| xl司令第一季动漫在线观看免费漫画 | 声生不息港乐季免费观看完整版| 360大佬爱上我第四季观看| 重庆电视剧| 胖妹最近10天的视频| 凤归巢短剧全集免费观看完整版| 台湾版《棘手狂情》星辰| 女生刘海两边的头发叫什么 | 豪门大佬的校草男友| 朋友的妈妈动漫| 咱们村的年轻人| 3对1:三人| 心之全蚀| 拥抱春天罗曼史| 坎贝奇第二部曲品味人生电影在线| 电竞少女冠军:带队拿第一全集免费| 沉香如屑开播| 圣天门口| 执行秘书电影在线观看| 寒战2下载| 金玉满堂电视剧| 插曲的痛在线观看完整版 | 食人鱼3d电影| 动感之星之妖精168集全集| 坎贝奇完整版| 《卖豪车女销售》在线观看| 墙头马上电影| 裸体按摩电影| 天蝎第一季| 青春环游记5季免费播放| 乳房按摩电影| 老舅1-40集全免费播放| 高清《沸腾人生》免费观看| 欧美z0zo人与劲物在线观看| 《爱我几何》ViP| 王国2在线观看完整版| 娜塔莎 劳佳姆| 半把剪刀| 男与女完整版电视剧免费高清| 《女兵俘虏营》在线观看免费完整版| 神断狄仁杰第三部全集| 灌篮高手国语版| 喜爱夜蒲 2| 放韩国电影特殊游泳的裸课| 荣誉守则(成人版)在线观看| 张康贾旭明为什么消失了 | 迈克尔杰克逊 危险| 烬相思 电视剧| 万山特区| 《特殊游泳教练》完整版》 - 国语剧情手机免费观看... 韩国其它2017很 | 千金女贼| 漂亮的女邻居2做爰| 大时代粤语版40集免费观看| 满天星法版免费壮志凌云| 电视剧少年白马醉春风全集免费观看 | 侦探成旭2千年迷局| 总统夫人在线观看罗丽星克莱尔| 解脱美女睡衣| 电视剧林师傅在首尔| 突围靳东43集全集免费观看策驰| zzzxxx免费在线观看| 少女大人第一集免费观看| 王牌对王牌第五季免费| 苍井空钱免费观看| 法国空姐第4部完整版在线播放| 电视剧一生为奴| 《西游降魔篇》| 混血大学生精油按摩电影| 以猫饲爱电视剧| 小大夫电视剧| 变种dna| 瑟瑟屋| 公主嫁到大结局| 淘宝公布2023年度丑东西| 好男儿之情感护理| 新加坡战争2011很差导演:彭禺厶主演:金九拉 金利娜 李硕薰 GREE简介:主角Sara | 沧元图第二季59集完整版| 岑溪市| 美味快递员特殊待遇2在线观看免费高清| 喜耕田的故事第2部| 男生吃女生的兔子头会变黑吗 | 鬼画符国语| 超级快递| 《聊斋之仙根》徐锦江| 春暖花开电视剧全集| 猪猪侠泡泡糖| 《流浪地球1》高清免费看| 比思特区东方美人| 如意芳霏在线观看| 我的最爱粤语高清| 季雨倾城未删减| 赤坂丽《牙医诊所》在线观看免费| 高清《绝密卧底》在线观看| 新审死官 电视剧| 甜蜜惩罚全集| 3v1三人一次性体检视频| 《奇迹》台剧| 赤裸羔羊| 碌曲县| 男生女生嗟磋嗟磋磋| 壮志凌云女飞行员版本| 甄嬛传电视剧全集完整版免费观看| 朴雅珍《蓝色隐形帽子》| 捆绑堵嘴3级强奸电影| 交换温柔韩国完整版| あずみ恋| 戴安琳恩的满天星三部曲| 酒店服务员在线观看| 电视剧流水迢迢| 《猎杀史卡佩塔 第一季》| 丈夫不在中午的美好时光| 一生一世电视剧免费播放| 王君安越剧名段欣赏| 味道云南 纪录片| 酒井法子空蝉之森原版| 蜘蛛侠3英雄无归在线观看枪版| 电视剧温柔的背后在线观看 | 热情邻居| 清晨满天星完整版| 将电动牙刷放在小洞里| 傻婿觉醒:大佬跪迎全集免费| 雷小翼个人简介| 啄木鸟版壮志凌云电影在线观看完整版| 大内密探00性性| 沉默羔羊| 电影《长津湖》免费版| 《新金莲外传》在线观看| 电影太极张三丰| 黑客帝国在线看| 七三一全部演员表| 凯帕克全集在线观看| 斗罗大陆196集在线观看| 我的婆婆怎么那么可爱| 新妈妈免费在线观看| 《花子与倔强的驱魔师》在线观看22| 美发店的特殊服务4| 危险伴侣| 我欲为人| 肉蔻之香| 《私人航空》免费在线观看| 电视剧绝世双骄| 同桌上课揉我下面好湿H| 伊春市| 白峰电影在线观看平台601 | 彭丹徐锦江电影《悟间道之奇缘》 | 黛比浪漫女教案全集| 法国空乘15在线看免费版| 没落贵族琉璃川动画片| 苍兰诀电视剧在线观看完整版免费 | 如懿传在线观看免费| 浪漫女家教在线播放全集免费观看中| 聊斋志异电影香港高清版| 含烟影院| 高清《好好的时光》电视剧| 农场保卫战满天星在线播放|