- uint8_t SPI_ReadWriteByte(uint8_t TxData)
- {
- uint8_t RxData;
- #if (MCP3564_SPI4 == 1)
- HAL_SPI_TransmitReceive(&hspi4,&TxData,&RxData,1,1000);
- #else
- HAL_SPI_TransmitReceive(&hspi2,&TxData,&RxData,1,1000);
- #endif
-
- return RxData;
- }
- void ReadWriteSPI(uint8_t *Read, uint8_t *Write, uint8_t unLen)
- {
- uint8_t i;
- i = 0;
- #if (MCP3564_SPI4 == 1)
- MCP3564_SPI_CS4_HIGH();
- MCP3564_SPI_CS4_LOW();
- #else
- MCP3564_SPI_CS2_HIGH();
- MCP3564_SPI_CS2_LOW();
- #endif
- do
- {
- Read<i> = SPI_ReadWriteByte(Write<i>);
- ++i;
- }while(i<unLen);
- }</i></i>
3. 硬件检查
检查有无短路,没有,上电,测试电压,OK
4. 驱动测试
简单看了一下芯片守则,发现MCP3564的寄存器地址和命令以及设备地址共同组成一个命令字节,设备地址是2个bit,我的地址是0x01,寄存器地址是0x00---0x0F,,命令有二个BIT,包含读或写,
10是写。11是读。
先读芯片的ID,单元是0x0E(01 1110 11, 组成命令格式0x7B),应该是0x0F,读出来果然是0x0F,说明是对的,不错,说明SPI读写没有问题,
5. 芯片手册 阅读
接下来是慢慢读一下MCP3564 的芯片手册,,
24位分辨率,
4差分或8单端 模拟输入
可编程数据速率高达153,6kSPS,
可编程增益0.33x到64x,
内部时钟和外部时钟可选
内部温度传感器
短路和开路检测
偏置和增益误差校准
IRQ中断输出,方便同步采集
16位CRC校准,保证数据OK
20M SPI兼容模式 模式0,0 或1,1
AVDD电压 2.7V--3.6V
VDD电压 1.8V--3.6V
封装很小UQFN 3mmx3mm
6. ADC读写测试
先写配置,
- CONFIG0 , 地址为 0x01, 8BIT, 配置值为 0x03 ,时钟配置,电流配置,ADC模式配置
- CONFIG1 , 地址为 0x02, 8BIT,配置值为 0x3C ,过采样配置
- CONFIG2 , 地址为 0x03, 8BIT,配置值为 0x8B ,Bias配置,PGA配置
- CONFIG3 , 地址为 0x04, 8BIT,配置值为 0xC3 ,连续采样,24BitADC,CRC 16
- 使能OFFSET CAL,使能GAIN CAL
- IRQ, 地址为 0x05, 8BIT,配置值为 0x07,IRQ模式,平时高电平,开始转换
- MUX, 地址为 0x06, 8BIT。配置值为 0xDE,配置内部温度传感器
- SCAN, 地址为 0x07, 24BIT,配置为0x201000,延时,扫描 通道
- TIMER, 地址为 0x08, 24BIT,配置为0x000004,扫描通道时间间隔
- OFFSETCAL, 地址为 0x09, 24BIT,配置为0x000000,配置OFFSET CAL
- GAINCAL, 地址为 0x0A, 24BIT,配置为0x800000,配置GAINSET CAL
然后读ADC值,
计算,和万用表测得的一样,很准确,OK
7. 使用总结
还算顺利,但发现MICROCHIP的datasheet,的结构没有ADI好,觉得读ADI的芯片手册感觉结构化
清晰些,个人只见,也许用microchip芯片较少的原因,还有发现microCHip的fae不热情啊,感觉问他也不管我,随便和我瞎扯,,没有办法,我们小啊