一、背景
最近项目使用了一款独立ADC芯片,记录一下使用的过程
二、介绍
芯片有四个采样通道 AIN0-AIN3
两个寄存器,分别为配置寄存器(Config Register)和采样数据读取寄存器(Conversion Register)
配置寄存器介绍
寄存器Bit | 说明 |
SS | 执行单次采样 |
MUX[2:0]
| 配置采样通道(单端采样还是差分采样) |
PGA[2:0]
| 采样的参考电压 |
MODE | 单次采样还是连续采样 |
DR[2:0]
| 采样速度 |
TS_MODE
| 配置温度采样还是外部通道采样 |
PULL_UP_EN
| 是否是能内部上拉 |
NOP[1:0]
| 是否将此配置写入配置寄存器中(下面会介绍) |
Reserved
| 保留 |
该芯片是使用了 SPI通讯接口,在此不多介绍SPI
我们可以在上电开始读取芯片的默认配置,来验证MCU和芯片之间的通讯以及芯片是否完好。
读取时序如下,参考手册
对于上面的时序图,简单来说,意思就是连续读取四个字节,最后面的两个字节就是当前的配置数据,那么如果读取呢
UINT16 Ads1118ReadDefaultCfg(void)
{
UINT8 read[2] = { 0,0 };
CS_EN_RESET; /* 片选使能 */
/* SPI1WriteByte 功能,发送一个字节同步读取一个字节,这是SPI的通讯机制 */
SPI1WriteByte(0x00);
SPI1WriteByte(0x00);
read[1] = SPI1WriteByte(0x00);
read[0] = SPI1WriteByte(0x00);
CS_EN_SET;
return ((read[1] << 8) | read[0]);
}
在这里为什么是发送0x00,是因为我们需要的是读取数据,那么配置数据不能有效,也就是说
需要 NOP[1:0] = 0b00 ,所以就讲写入数据为0x00
从手册来看默认的配置寄存器值为 058Bh ,通过对比即可。
需要注意的是,如果之前写过配置(也就是NOP[1:0] = 0b01 ),没有掉电的话,读出来值就是写入的配置值。
读取采样值,只需要读取前面两个字节即可。
UINT16 Ads1118Read(void)
{
UINT8 read[2] = { 0,0 };
CS_EN_RESET; /* 片选使能 */
read[1] = SPI1WriteByte(0x00);
read[0] = SPI1WriteByte(0x00);
CS_EN_SET;
return ((read[1] << 8) | read[0]);
}
配置寄存器,在这里配置的是连续采样模式 MODE = 0
void Ads1118SwitchSampleChn(UINT8 Chn)
{
UINT16 cfg = 0;
cfg |= (Chn << SAMPLE_CH_POS); /* 配置通道 */
cfg |= (VREF_2_048V << VREF_POS); /* 参考电压为 2.048V */
cfg |= (SAMPLE_RATE_8_SPS << SAMPLE_RATE_POS); /* 采样速度 */
cfg |= (PULL_UP_EN << PULL_UP_EN_POS);
cfg |= (NOP_UPDATE_CONFIG << NOP_POS); /* 更新配置 */
DEBUG("Config Value 0x%04X \r\n", cfg);
Ads1118WriteCfg(cfg);
}
UINT16 Ads1118WriteCfg(UINT16 Cfg)
{
CS_EN_RESET;
SPI1WriteByte(Cfg >> 8);
SPI1WriteByte(Cfg >> 0);
CS_EN_SET;
}