[原创/开源]重写AD7124驱动,所有寄存器可直接单独配置
本帖最后由 bolizhicheng204 于 2020-7-31 09:14 编辑最近又开始搞AD7124了,一直都很受不了ADI的底层驱动,感觉太繁琐,赋值、读取都很麻烦,也许是我水平问题吧,哈哈。反正我喜欢像STM32一样所有寄存器可以单独配置、读取。
花了一段时间改写了AD7124的底层驱动,大概测了一下,没啥问题,我用通道11,外部基准,测量外部基准轻松达到21位无噪声分辨率。
今日把整个工程文件上传,单片机型号是STM32F429IGT6,欢迎交流。 首先感谢楼主分享,想问一下,你的例程采样率能达到19.2K吗?要是到最高采样率,采集的数值是否稳定? N_EMBED 发表于 2020-7-31 10:09
首先感谢楼主分享,想问一下,你的例程采样率能达到19.2K吗?要是到最高采样率,采集的数值是否稳定? ...
没仔细看,目测应该没有问题,ADI的手册数据非常可信,我按照全功率最大速度跑,测量外部2.5V基准,不做任何滤波轻松达到21位无噪声分辨率,ADI还是很厉害的 谢谢分享 这个芯片稳定性怎么样,lz出货了多少这种芯片? zhcj66 发表于 2020-7-31 21:41
这个芯片稳定性怎么样,lz出货了多少这种芯片?
还没出货{:biggrin:} 之前用另一个型号,最近尝试一下准备替换,之前做过很多功课,这颗料稳定性应该不会差 目前使能了几个通道?数字滤波器怎么配的?用了通道序列器了的? zhcj66 发表于 2020-7-31 21:41
这个芯片稳定性怎么样,lz出货了多少这种芯片?
稳定,我们东区已有客户100K级别出货~
若无需低功耗模式,还有个low cost特别型号AD74-014可以选用的(电脑关了,型号可能记错了,若错了,明天来修改)。 有ADS1220的STM32F030的驱动,最近在搞,有点搞不定,谢谢 bolizhicheng204 发表于 2020-7-31 10:29
没仔细看,目测应该没有问题,ADI的手册数据非常可信,我按照全功率最大速度跑,测量外部2.5V基准,不做 ...
增加遇到AD779x系列的都容易 芯片无数据输出,彻底放弃了AD779X系类 ersha4877 发表于 2020-8-3 21:18
有ADS1220的STM32F030的驱动,最近在搞,有点搞不定,谢谢
在stm32f103上测试成功的
#include "includes.h"
#define ADS1x20_CS_GPIO GPIOD
#define ADS1x20_SCLK_GPIO GPIOD
#define ADS1x20_DIN_GPIO GPIOD
#define ADS1x20_DOUT_GPIO GPIOD
#define ADS1x20_CS_Pin GPIO_Pin_12
#define ADS1x20_SCLK_Pin GPIO_Pin_11
#define ADS1x20_DIN_Pin GPIO_Pin_13
#define ADS1x20_DOUT_Pin GPIO_Pin_14
#define ADS1x20_CS_Out(x) x?GPIO_SetBits(ADS1x20_CS_GPIO,ADS1x20_CS_Pin):GPIO_ResetBits(ADS1x20_CS_GPIO,ADS1x20_CS_Pin)
#define ADS1x20_SCLK_Out(x) x?GPIO_SetBits(ADS1x20_SCLK_GPIO,ADS1x20_SCLK_Pin):GPIO_ResetBits(ADS1x20_SCLK_GPIO,ADS1x20_SCLK_Pin)
#define ADS1x20_DIN_Out(x) x?GPIO_SetBits(ADS1x20_DIN_GPIO,ADS1x20_DIN_Pin):GPIO_ResetBits(ADS1x20_DIN_GPIO,ADS1x20_DIN_Pin)
#define ADS1x20_DOUT_Get GPIO_ReadInputDataBit(ADS1x20_DOUT_GPIO, ADS1x20_DOUT_Pin)
void ADS1x20_Delay(unsigned short x)//单位1us
{
Delay_us(x);
}
void ADS1x20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE );
//CS
GPIO_InitStructure.GPIO_Pin = ADS1x20_CS_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADS1x20_CS_GPIO, &GPIO_InitStructure);
//SCLK
GPIO_InitStructure.GPIO_Pin = ADS1x20_SCLK_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADS1x20_SCLK_GPIO, &GPIO_InitStructure);
//DIN
GPIO_InitStructure.GPIO_Pin = ADS1x20_DIN_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADS1x20_DIN_GPIO, &GPIO_InitStructure);
//DOUT
GPIO_InitStructure.GPIO_Pin = ADS1x20_DOUT_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(ADS1x20_DOUT_GPIO, &GPIO_InitStructure);
}
//读写ADS1x20
//short:芯片配置
//Chip:芯片内的配置返回
//return:ReadData
unsigned char ADS1x20_ReadWirte(unsigned char Config)
{
unsigned char i;
unsigned short config=0,//配置
data=0;//读取ADC
// ADS1x20_CS_Out(0);
config = Config;
for(i=0;i<8;i++)
{
//ADS1x20_Delay(1);
ADS1x20_SCLK_Out(1);
if(config&0x80)
{
ADS1x20_DIN_Out(1);
}
else
{
ADS1x20_DIN_Out(0);
}
//ADS1x20_Delay(1);
ADS1x20_SCLK_Out(0);
data = data<<1;
if(ADS1x20_DOUT_Get)
{
data++;
}
config = config<<1;
}
// ADS1x20_CS_Out(1);
return data;
}
//ADS1x20读取AD数据
void ADS1x20_ReadData(unsigned char*Data)
{
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_RDATA);
#ifdef ADS1120
*Data++ = ADS1x20_ReadWirte(0xFF);
*Data++ = ADS1x20_ReadWirte(0xFF);
#else //ADS1220
*Data++ = ADS1x20_ReadWirte(0xFF);
*Data++ = ADS1x20_ReadWirte(0xFF);
*Data++ = ADS1x20_ReadWirte(0xFF);
*Data++ = ADS1x20_ReadWirte(0xFF);
#endif
ADS1x20_CS_Out(1);
}
//ADS1x20复位
void ADS1x20_Reset(void)
{
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_RESET);
ADS1x20_CS_Out(1);
}
//ADS1x20发送开始转换
void ADS1x20_StartConversion(void)
{
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_START);
ADS1x20_CS_Out(1);
}
//低功耗
void ADS1x20_PowerDown(void)
{
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_POWERDOWN);
ADS1x20_CS_Out(1);
}
//ADS1x20_ReadRegister:读取寄存器配置
//pData:一次读取ADS1x20的4个寄存器配置
//注:pData返回的数据空间需要4bit
//这里是为了方便一次读出了所有寄存器的值,也可以像写寄存器那样单独读出单个寄存器的值
void ADS1x20_ReadRegister(unsigned char *pData)
{
unsigned char i;
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_RREG|0x03);
for (i=0; i< 4; i++)// get the register content
{
*pData++ = ADS1x20_ReadWirte(0xFF);
}
ADS1x20_CS_Out(1);
}
//ADS1x20_WriteRegister:写入寄存器配置
//StartAddress:写入寄存器的地址(如:00寄存器则配置为0;03寄存器则配置为3)
//NumRegs:写入n个寄存器数据,从第StartAddress寄存器开始写
//pData:写入寄存器的数据
//如:把01寄存器写0x58 02寄存器写入0x49
// unsigned char Temp;
// Temp = 0x58;
// Temp = 0x49;
// ADS1x20_WriteRegister(1,2,Temp);
void ADS1x20_WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData)
{
unsigned char i;
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_WREG | (((StartAddress<<2) & 0x0c) |((NumRegs-1)&0x03)));// send the command byte
for (i=0; i< NumRegs; i++)// send the data bytes
{
ADS1x20_ReadWirte(*pData);
pData++;
}
ADS1x20_CS_Out(1);
}
void ADS1x20_ReadChannel(unsigned char Channel,unsigned char*Data)
{
unsigned char Register;
Register = Channel|ADS1x20_00_GAIN6|ADS1x20_00_PGA_BYPASS_E;//通道|放大倍数|PGA旁路
Register = ADS1x20_01_DR2|ADS1x20_01_MODE0|ADS1x20_01_CM0|ADS1x20_01_TS0|ADS1x20_01_BCS0;//转换速率|速率模式|转换模式|温度还是ADC|电流源开关
Register = ADS1x20_02_VREF0|ADS1x20_02_FIR1|ADS1x20_02_IDAC0;//参考电压|滤波|恒流源大小
Register = ADS1x20_03_I1MUX0|ADS1x20_03_I2MUX0|ADS1x20_03_DRDYM1;//恒流源1连接|恒流源2连接|转换结束RDRY和DOUT管脚拉低
ADS1x20_WriteRegister(0,4,Register);//设置寄存器
ADS1x20_StartConversion();//转换开始
while(ADS1x20_DOUT_Get);//等待数据转换结束
ADS1x20_ReadData(Data);//读取数据
// ADS1x20_ReadRegister(Register);
ADS1x20_PowerDown();//低功耗
}
//读取芯片温度
unsigned short ADS1x20_ReadChip(void)
{
unsigned charRegister;
unsigned short temp;
Register = ADS1x20_01_DR2|ADS1x20_01_MODE0|ADS1x20_01_CM0|ADS1x20_01_TS1|ADS1x20_01_BCS0;//转换速率|速率模式|转换模式|温度还是ADC|电流源开关
ADS1x20_WriteRegister(1,1,&Register);//设置寄存器
ADS1x20_StartConversion();//转换开始
while(ADS1x20_DOUT_Get);//等待数据转换结束
ADS1x20_CS_Out(0);
ADS1x20_ReadWirte(ADS1x20_RDATA);//发送读命令
temp = ADS1x20_ReadWirte(0xFF);//读芯片温度高字节
temp = temp<<8;
temp = temp+ADS1x20_ReadWirte(0xFF);//读芯片温度低字节
ADS1x20_CS_Out(1);
// ADS1x20_ReadRegister(Register);
ADS1x20_PowerDown();//低功耗
return temp;
}
//读取芯片温度
float ADS1x20_ReadChipTemp(void)
{
unsigned short temp;
float Temp;
temp = ADS1x20_ReadChip();
Temp = (float)(temp*0.00625);//温度=转换数据*0.03125/5(0.03125/5=0.00625)
return Temp;
}
#ifdef ADS1120
#else //ADS1220
#endif
#ifndef __ADS1X20_H
#define __ADS1X20_H
#defineADS1120//如果定义了就是ADS1120如果没定义就是ADS1220
#ifdef ADS1120
#else //ADS1220
#endif
#define ADS1x20_RESET 0x06//Reset the device
#define ADS1x20_START 0x08//Start or restart conversions
#define ADS1x20_POWERDOWN 0x02//Enter power-down mode
#define ADS1x20_RDATA 0x10//Read data by command
#define ADS1x20_RREG 0x20//Read nn registers starting at address rr
#define ADS1x20_WREG 0x40//Write nn registers starting at address rr
//寄存器00
#define ADS1x20_00_MUX0 0x00//AINP = AIN0, AINN = AIN1 (default)
#define ADS1x20_00_MUX1 0x10//AINP = AIN0, AINN = AIN2
#define ADS1x20_00_MUX2 0x20//AINP = AIN0, AINN = AIN3
#define ADS1x20_00_MUX3 0x30//AINP = AIN1, AINN = AIN2
#define ADS1x20_00_MUX4 0x40//AINP = AIN1, AINN = AIN3
#define ADS1x20_00_MUX5 0x50//AINP = AIN2, AINN = AIN3
#define ADS1x20_00_MUX6 0x60//AINP = AIN1, AINN = AIN0
#define ADS1x20_00_MUX7 0x70//AINP = AIN3, AINN = AIN2
#define ADS1x20_00_MUX8 0x80//AINP = AIN0, AINN = AVSS
#define ADS1x20_00_MUX9 0x90//AINP = AIN1, AINN = AVSS
#define ADS1x20_00_MUXA 0xA0//AINP = AIN2, AINN = AVSS
#define ADS1x20_00_MUXB 0xB0//AINP = AIN3, AINN = AVSS
#define ADS1x20_00_MUXC 0xC0//(VREFPx ?VREFNx) / 4 monitor (PGA bypassed)
#define ADS1x20_00_MUXD 0xD0//(AVDD ?AVSS) / 4 monitor (PGA bypassed)
#define ADS1x20_00_MUXE 0xE0//AINP and AINN shorted to (AVDD + AVSS) / 2
#define ADS1x20_00_MUXF 0xF0//Not used
#define ADS1x20_00_GAIN0 0x00//Gain = 1 (default)
#define ADS1x20_00_GAIN1 0x02//Gain = 2
#define ADS1x20_00_GAIN2 0x04//Gain = 4
#define ADS1x20_00_GAIN3 0x06//Gain = 8
#define ADS1x20_00_GAIN4 0x08//Gain = 16
#define ADS1x20_00_GAIN5 0x0A//Gain = 32
#define ADS1x20_00_GAIN6 0x0C//Gain = 64
#define ADS1x20_00_GAIN7 0x0E//Gain = 128
#define ADS1x20_00_PGA_BYPASS_E 0x00//PGA enabled (default) The PGA is always enabled for gain settings 8 to 128, regardless of the PGA_BYPASS setting.
#define ADS1x20_00_PGA_BYPASS_D 0x01//PGA disabled and bypassed
//寄存器01
//------------------------------------Normal mod------Duty-cycle mode--Turbo mode
#define ADS1x20_01_DR0 0x00//20 SPS (default)-5 SPS-----------40 SPS
#define ADS1x20_01_DR1 0x20//45 SPS-----------11.25 SPS-------90 SPS
#define ADS1x20_01_DR2 0x40//90 SPS-----------22.5 SPS--------180 SPS
#define ADS1x20_01_DR3 0x60//175 SPS----------44 SPS----------350 SPS
#define ADS1x20_01_DR4 0x80//330 SPS----------82.5 SPS--------660 SPS
#define ADS1x20_01_DR5 0xA0//600 SPS----------150 SPS---------1200 SPS
#define ADS1x20_01_DR6 0xC0//1000 SPS---------250 SPS---------2000 SPS
#define ADS1x20_01_DR7 0xE0//Not used---------Not used--------Not used
#define ADS1x20_01_MODE0 0x00//Normal mode (256-kHz modulator clock, default)
#define ADS1x20_01_MODE1 0x08//Duty-cycle mode (internal duty cycle of 1:4)
#define ADS1x20_01_MODE2 0x10//Turbo mode (512-kHz modulator clock)
#define ADS1x20_01_MODE3 0x18//Not used
#define ADS1x20_01_CM0 0x00//Single-shot mode (default)
#define ADS1x20_01_CM1 0x04//Continuous conversion mode
#define ADS1x20_01_TS0 0x00//Disables temperature sensor (default)
#define ADS1x20_01_TS1 0x02//Enables temperature sensor
#define ADS1x20_01_BCS0 0x00//Current sources off (default)
#define ADS1x20_01_BCS1 0x01//Current sources on
//寄存器02
#define ADS1x20_02_VREF0 0x00//Internal 2.048-V reference selected (default)
#define ADS1x20_02_VREF1 0x40//External reference selected using dedicated REFP0 and REFN0 inputs
#define ADS1x20_02_VREF2 0x80//External reference selected using AIN0/REFP1 and AIN3/REFN1 inputs
#define ADS1x20_02_VREF3 0xC0//Analog supply AVDD used as reference
#define ADS1x20_02_FIR0 0x00//No 50-Hz or 60-Hz rejection (default)
#define ADS1x20_02_FIR1 0x10//Simultaneous 50-Hz and 60-Hz rejection
#define ADS1x20_02_FIR2 0x20//50-Hz rejection only
#define ADS1x20_02_FIR3 0x30//60-Hz rejection only
#define ADS1x20_02_PSW0 0x00//Switch is always open (default)
#define ADS1x20_02_PSW1 0x08//Switch automatically closes when the START/SYNC command is sent and opens when the POWERDOWN commandis issued
#define ADS1x20_02_IDAC0 0x00//Off (default)
#define ADS1x20_02_IDAC1 0x01//Not used
#define ADS1x20_02_IDAC2 0x02//50 uA
#define ADS1x20_02_IDAC3 0x03//100 uA
#define ADS1x20_02_IDAC4 0x04//250 uA
#define ADS1x20_02_IDAC5 0x05//500 uA
#define ADS1x20_02_IDAC6 0x06//1000 uA
#define ADS1x20_02_IDAC7 0x07//1500 uA
//寄存器03
#define ADS1x20_03_I1MUX0 0x00//IDAC1 disabled (default)
#define ADS1x20_03_I1MUX1 0x20//IDAC1 connected to AIN0/REFP1
#define ADS1x20_03_I1MUX2 0x40//IDAC1 connected to AIN1
#define ADS1x20_03_I1MUX3 0x60//IDAC1 connected to AIN2
#define ADS1x20_03_I1MUX4 0x80//IDAC1 connected to AIN3/REFN1
#define ADS1x20_03_I1MUX5 0xA0//IDAC1 connected to REFP0
#define ADS1x20_03_I1MUX6 0xC0//IDAC1 connected to REFN0
#define ADS1x20_03_I1MUX7 0xE0//Not used
#define ADS1x20_03_I2MUX0 0x00//IDAC2 disabled (default)
#define ADS1x20_03_I2MUX1 0x04//IDAC2 connected to AIN0/REFP1
#define ADS1x20_03_I2MUX2 0x08//IDAC2 connected to AIN1
#define ADS1x20_03_I2MUX3 0x0C//IDAC2 connected to AIN2
#define ADS1x20_03_I2MUX4 0x10//IDAC2 connected to AIN3/REFN1
#define ADS1x20_03_I2MUX5 0x14//IDAC2 connected to REFP0
#define ADS1x20_03_I2MUX6 0x18//IDAC2 connected to REFN0
#define ADS1x20_03_I2MUX7 0x1C//Not used
#define ADS1x20_03_DRDYM0 0x00//Only the dedicated DRDY pin is used to indicate when data are ready (default)
#define ADS1x20_03_DRDYM1 0x02//Data ready is indicated simultaneously on DOUT/DRDY and DRDY
//#define ADS1x20_SADC0_1 ADS1x20_OS|ADS1x20_MUX0|ADS1x20_PGA5|ADS1x20_MODE1|ADS1x20_SPS4|ADS1x20_TEMP0|ADS1x20_PULL1//单次使能|AIN0-AIN1|PGA16|单次|128SPS|ADC|弱上拉
//#define ADS1x20_ADC0_1 ADS1x20_MUX0|ADS1x20_PGA5|ADS1x20_MODE0|ADS1x20_SPS4|ADS1x20_TEMP0|ADS1x20_PULL1//AIN0-AIN1|PGA16|连续|128SPS|ADC|弱上拉
//#define ADS1x20_STEMP ADS1x20_OS|ADS1x20_MODE1|ADS1x20_SPS4|ADS1x20_TEMP1|ADS1x20_PULL1//单次使能|单次|128SPS|温度|弱上拉
//#define ADS1x20_TEMP ADS1x20_MODE0|ADS1x20_SPS4|ADS1x20_TEMP1|ADS1x20_PULL1//连续|128SPS|温度|弱上拉
void ADS1x20_Init(void);
void ADS1x20_ReadRegister(unsigned char *pData);
void ADS1x20_WriteRegister(unsigned char StartAddress, unsigned char NumRegs, unsigned char * pData);
void ADS1x20_ReadChannel(unsigned char Channel,unsigned char*Data);
unsigned short ADS1x20_ReadChip(void);
float ADS1x20_ReadChipTemp(void);
#endif
reflecter 发表于 2020-8-3 20:37
稳定,我们东区已有客户100K级别出货~
若无需低功耗模式,还有个low cost特别型号AD74-014可以选用的(电 ...
100k 能到什么价位,还有有效数据能稳定到多少位 reflecter 发表于 2020-8-3 20:32
目前使能了几个通道?数字滤波器怎么配的?用了通道序列器了的?
这么好的帖子,就知道你会来{:biggrin:} {:biggrin:}
1个通道,无滤波,都是最基本的功能,我偏向于硬件和方案设计,程序有别人在做,我只是业余时间测试一下。 zhcj66 发表于 2020-8-4 08:04
在stm32f103上测试成功的
谢谢了,断断续续搞了个把星期时间了,都没有搞定,感谢了 reflecter 发表于 2020-8-3 20:37
稳定,我们东区已有客户100K级别出货~
若无需低功耗模式,还有个low cost特别型号AD74-014可以选用的(电 ...
搜了一下,没有你说的AD74-014这个型号,AD74开头的大多是12位和16位的,
如果只是没有低功耗,其它功能和AD7124一样,那岂不是物美价廉的好东西 ersha4877 发表于 2020-8-3 21:18
有ADS1220的STM32F030的驱动,最近在搞,有点搞不定,谢谢
我之前写过ADS1220相关的帖子,不知道是不是我水平问题,这个片子我觉得精度不好,没有ADI的片子好伺候 bolizhicheng204 发表于 2020-8-4 10:28
我之前写过ADS1220相关的帖子,不知道是不是我水平问题,这个片子我觉得精度不好,没有ADI的片子好伺候 ...
没有用过,坛里的高手说还行,也就试试看 bolizhicheng204 发表于 2020-8-4 08:56
这么好的帖子,就知道你会来
1个通道,无滤波,都是最基本的功能,我偏向于硬件 ...
哈哈~{:handshake:} N_EMBED 发表于 2020-8-4 09:41
搜了一下,没有你说的AD74-014这个型号,AD74开头的大多是12位和16位的,
如果只是没有低功耗,其它功能 ...
果然记错了,是AD70/046:内部型号了的,应是低功耗那块未做测试验证,挤了点成本出来。
bolizhicheng204 发表于 2020-8-4 10:28
我之前写过ADS1220相关的帖子,不知道是不是我水平问题,这个片子我觉得精度不好,没有ADI的片子好伺候 ...
TI得就是各种寄存器 搞得很晕,我当时参照谁的忘记了,但是我那个驱动是调通了 reflecter 发表于 2020-8-4 12:39
果然记错了,是AD70/046:内部型号了的,应是低功耗那块未做测试验证,挤了点成本出来。
...
这个也搜不到,只是内部测试用的?价格是AD7124-4的60%?哪里可以搞点样品测试一下 请问程序里面读写寄存器时候,应该是要先写通讯寄存器,然后再写相应的寄存器,但是你程序在写寄存器的时候,没有先写通讯寄存器,读寄存器的时候,先写了通讯寄存器,这个没有看明白,能解析一下吗 全速19.2K下,建立时间最短,有效分辨率最多16位多,除非你软件滤波 zhcj66 发表于 2020-8-4 13:30
TI得就是各种寄存器 搞得很晕,我当时参照谁的忘记了,但是我那个驱动是调通了 ...
大哥,我用AD7124-4 采集2个3线PT100怎么画图 有遇到通道间串扰的问题吗?如何解决 windyxin872 发表于 2021-3-3 11:22
大哥,我用AD7124-4 采集2个3线PT100怎么画图
(引用自24楼)
电流源要切换输出通道吧 国产完全替代,核芯互联cl2434,最近在推广,插拔替换,寄存器spi及工作模式完全兼容 真较劲的话这些东西用好了事情很多,所以没有人用这些东西做万用表。当然万用表还有其他的瓶颈,但ad转换就没有瓶颈吗,其实每个人都清楚,假装看不见就是了
页:
[1]