在使用SPI读取DEVICEID来验证SPI是否通信成功时存在SPI接受到的数据与发送数据一样问题,具体如下:
//Power-on Device
uint8_t ***[3]={DACX1416_SPICONFIG,0x0A,0x84};
SPI1_1_NSS_Enable();
HAL_SPI_Transmit(&hspi1, ***, 3, DACx1416_Timeout_3);
SPI1_1_NSS_Disable();
uint8_t cmd[3] = {0x81,0x00,0x00};
uint8_t ID1[3] = {0x00,0x00,0x00};
uint16_t DACX61416_ID = 0;
//0x81=23-16位,R/W读写位(1x)+DEVICEID Register 01h
SPI1_1_NSS_Enable(); /* Send the read ID command */
HAL_SPI_Transmit(&hspi1, cmd, 3, DACx1416_Timeout_3); /* Reception of the data */
HAL_SPI_Receive(&hspi1,ID1, 3, DACx1416_Timeout_3);
SPI1_1_NSS_Disable();
printf("%x%x\n",ID1[1],ID1[2]);
DACX61416_ID = ((ID1[1] << 8) | ID1[2]) & 0xFC;
printf("%x\n",DACX61416_ID);
Amy Luo:
您好,
您可以将您读取DEVICEID的SPI通信波形附上来吗
,
user6517830:
暂时未测SPI通信波形,能否先告知怎样判断DACX61416是否正常工作?根据数据手册,看到的是DEV-PWDWN位置0
,
Amy Luo:
是的,默认状态下设备是power-down模式,内部基准电压也是powers down状态,需要通过SPI配置寄存器
,
user6517830:
能否帮忙提供一下该芯片基于STM32CUBEMX HAL库的参考程序?
,
Amy Luo:
抱歉,没有参考程序可提供给您
SPI通信在数据手册9.5.1 Stand-Alone Operation有说明,通信时序图可查看Figure 50
如果您有EVM板的话,您可以使用EVM GUI以方框图或直接寄存器访问方式与设备寄存器进行交互
,
user6517830:
波形如下,发送0x03,0x0A,0x86,使芯片工作,怎样判断芯片是否工作呢?再发送0x81,0x00,0x00来读取DEVICEID,接收到的数据是0x81,0x00,0x00,即使发送0x81,0x01,0x02,接收到的数据是0x81,0x01,0x02,发送与接收一样,故怀疑DAC芯片未工作
,
Amy Luo:
写入之后能够正确读出来说明寄存器配置正确了
上图中黄色的信号是SCLK信号吗,绿色信号是SDI?这样的话发送0x03,0x0A,0x86使能设备,然后再读出来,看是否正确
请注意在对设备进行读写操作期间,cs信号需至少在24 个SCLK周期内是低电平
,
user6517830:
黄色是SCLK,绿色是SDI,CS片选信号在通信期间是低电平。发送0x03,0x0A,0x86是能设备,按道理就应该可以在REF 33 引脚测到2.5V电压,然后并没有;再发送0x81,0x00,0x00来读取DEVICEID,未接收到正确的ID,实际为0x81,0x00,0x00,即使发送0x81,0x01,0x02,接收到的数据是0x81,0x01,0x02,发送与接收一样,故怀疑DAC芯片未工作
,
Amy Luo:
内部基准电压使能需配置04寄存器
您可以把您读取寄存器的通信示波器图附上来吗
,
user6517830:
如下图所示,***,0x84,并使能REF
,
user6517830:
现在解决了,可以读取到ID,0x90,0x30,读取需分两步
//Power-on Deviceuint8_t ***[3]={DACX1416_SPICONFIG,0x0A,0x84};SPI1_1_NSS_Enable();HAL_SPI_Transmit(&hspi1, ***, 3, DACx1416_Timeout_3);SPI1_1_NSS_Disable();//Power-on Internal Referenceuint8_t GENCONFIG[3]={DACX1416_GENCONFIG,0x3F,0x00};SPI1_1_NSS_Enable();HAL_SPI_Transmit(&hspi1, GENCONFIG, 3, DACx1416_Timeout_3);SPI1_1_NSS_Disable();uint8_t cmd[3] = {0x81,0x00,0x00};uint8_t ID1[3] = {0x00,0x00,0x00};uint8_t ID0[3] = {0x00,0x00,0x00};uint16_t DACX61416_ID = 0;//0x81=23-16位,R/W读写位(1x)+DEVICEID Register 01h/* Send the read ID command */SPI1_1_NSS_Enable();HAL_SPI_Transmit(&hspi1, cmd, 3, DACx1416_Timeout_3);SPI1_1_NSS_Disable();/* Reception of the data */SPI1_1_NSS_Enable();//HAL_SPI_Transmit(&hspi1, ID0, 3, DACx1416_Timeout_3);//HAL_SPI_Receive(&hspi1, ID1, 3, DACx1416_Timeout_3);HAL_SPI_TransmitReceive(&hspi1, ID0, ID1, 3, DACx1416_Timeout_3);SPI1_1_NSS_Disable();printf("%x%x\n",ID1[1],ID1[2]);
,
Amy Luo:
很高兴您的问题得到解决,感谢您的反馈与分享