有一个模拟板子上有4个dac芯片,2颗ad5762和2颗ad5764,最终使用了mcu的硬件spi做菊花链通信。



可以看到mcu的spi sdo进入到u29 ad5762的sdin后,u29 ad5762的sdo进入到u57 ad5762的sdi,依次类推,最后从u69 ad5764的sdo进入到mcu的sdin中,完成一个环。而ad5762与ad5764的所有LDAC都是并联的,公用mcu上的一个pin脚。

菊花链的部分还是要多看芯片手册。

从图中可以看到spi第一个发送的bit是db23,也就是MSB在前,同时SDO线上标明了INPUT WORD FOR DAC N,是什么意思呢?板子上有4颗dac芯片,就是说spi第1次发送的数据其实是给第4颗芯片的,spi第4次发送的数据才是给第1颗芯片的。第几颗芯片跟原理图的连线有关系,需要自己根据实际情况判断。

这里可以看到有一个t15时间,极短,但是很重要。还有LDAC的t10时间,也非常重要。在芯片手册中会有对时间的最大最小值说明。

首先初始化芯片的reset pin和ldac pin
static void dac_init_ldac_reset_pin(void)
{
// dac reset pin
GPIO_SetMode(PA, BIT14, GPIO_PMD_OUTPUT);
SYS->GPA_MFP &= (~(1 << 14));
// dac ldac pin
GPIO_SetMode(PA, BIT15, GPIO_PMD_OUTPUT);
SYS->ALT_MFP &= (~(1 << 9));
SYS->GPA_MFP &= (~(1 << 15));
LDAC = PIN_HIGH;
}
紧接着对mcu的spi接口进行初始化,并对ad5762、ad5764的寄存器进行初始化,相关寄存器就是量程、offset与gain。这其中offset与gain的值直接影响了dac的输出精度。在我之前的文章中有提到如何校准没有offset和gain寄存器的adc芯片。如何设置offset与gain的方法在芯片手册写的很详细了,在此就不做说明了。
void hw_ad5764_init(void)
{
dac_init_ldac_reset_pin();
CLK_SetModuleClock(SPI1_MODULE, CLK_CLKSEL1_SPI1_S_HCLK, MODULE_NoMsk);
CLK_EnableModuleClock(SPI1_MODULE);
// PC8 -> CS
SYS->GPC_MFP |= (1 << 8);
SYS->ALT_MFP1 &= (~(1 << 23));
// PC9 -> SCLK
SYS->GPC_MFP |= (1 << 9);
// PC10 -> MISO
SYS->GPC_MFP |= (1 << 10);
// PC11 -> MOSI
SYS->GPC_MFP |= (1 << 11);
RSTIN = 0;
delay_100ms(1);
RSTIN = 1;
SYS_ResetModule(SPI1_RST);
SPI_Open(SPI1, SPI_MASTER, SPI_MODE_1, 24, 4000000); // send 24bit once, spi frequence 4MHz
SPI1->CNTRL &= (~(0x0f << 12));
SPI_DisableFIFO(SPI1);
SPI_DisableAutoSS(SPI1); // nuc123 spi autoss error
init_dac_range_reg(spi_ad5764.send_array, DAC_A);
init_dac_range_reg(spi_ad5764.send_array, DAC_B);
init_dac_range_reg(spi_ad5764.send_array, DAC_C);
init_dac_range_reg(spi_ad5764.send_array, DAC_D);
init_dac_offset_reg(&t1, &spi_ad5764);
init_dac_gain_reg(&t1, &spi_ad5764);
init_dac_data_reg(spi_ad5764.send_array, 0x8000);
memset(spi_ad5764.send_array, 0, sizeof(spi_ad5764.send_array));
}
这里我使用的mcu是新唐公司的NUC123SD4AN0,spi接口没有使用中断模式,根据芯片手册可以知道,ad5762、ad5764的寄存器是24bit的,那么在初始化spi接口时,需要将一次发送的bit长度设置为24,但是spi接口发送的变量一定是32bit的,也就是uint32_t类型,这并不妨碍spi接口一次只发送24bit,这一点在NUC123.h文件中有说明。

spi接口的速度我设置的是4MHz,已经很快了,而ad5762和ad5764的最大时钟是16MHz,目前我还用不到。
在使用NUC123SD4AN0的时候,我发现AutoSS(将片选pin交给硬件管理)并不能正常通信,当软件控制片选pin的时候则是正常的,这个bug我并未解决。
最后需要实现spi的读写函数,对ad5762和ad5764来说,我们只需要往里写值让dac芯片输出就行了,其实返回值是可以不要的。
void hw_spi_read_write(uint32_t *send_data, uint32_t *receice_data, uint8_t size)
{
SPI_SET_SS0_LOW(SPI1);
for (uint8_t i = 0; i < size; i++

本文介绍了一种使用MCU通过SPI接口与多个DAC芯片(包括AD5762和AD5764)进行菊花链通信的方法。重点讲解了SPI配置、寄存器初始化及通信时序。
最低0.47元/天 解锁文章
879

被折叠的 条评论
为什么被折叠?



