Part Number:TLV5638
你好,
目前使用芯片TLV5638时,遇到无法实现A、B两通道同时输出电压的问题,控制发了3个16的波形,其中第一个波形设置基准电压,实际测量正确;第二个波形时写数值到BUFFER,目前不正常;第三个波形是设置A通道数值且从BUFFER更新数值。如果将第三个波形放到第二个波形,再增加新的第三个波形,即设置B通道数值以及更新BUFER,则A通道无输出,B通道有输出。请问一下,是什么原因导致的呢?
System_Define.h
System_SPI.c
// ==================�������Ȩ��������Ը�����Ƽ�����˾����=================== // �ļ����ƣ�System_SPI.c // �������ڣ�2023-4-10 // ������Ա������� // ����������СϵͳSPIģ�� // �����ڣ� // ����Ա�� // �����ݣ� // =========================================================================== #include "System_Define.h" // ���ⲿ���ú�������------------------------------------------------------ void InitSPI(void); // ��ʼ��SPI void HardOverCurrentDataSet(Uint16 VoutA, Uint16 VoutB); // ����Ӳ���������� // �ļ��ڲ���������-------------------------------------------------------- static void InitSPI0(void); // ��ʼ��SPI0 static void InitSPI1(void); // ��ʼ��SPI1 void SPI0_DataSend(Uint16 Data); // SPI0���ݷ��� void SPI1_DataSend(Uint16 Data); // SPI1���ݷ��� //static Uint8 SPI0_DataRead(void); // SPI0���ݶ�ȡ //static Uint8 SPI1_DataRead(void); // SPI1���ݶ�ȡ static void InitTLV5638(void); // оƬTLV5638��ʼ�� //static Uint16 VolToData(Uint8 RefMode, float32 ExRef, float32 Vol); // ��ѹת�������� // �ļ��ڲ���������-------------------------------------------------------- // �ṹ�嶨��-------------------------------------------------------------- static XSpiPs Spi0; // SPI0��������ʵ������ static XSpiPs Spi1; // SPI1��������ʵ������ // ======================================================================== // �������ƣ�InitSPI // ����������� // ����������� // ���룺�� // �������� // �������ܣ���ʼ��SPI // ======================================================================== void InitSPI(void) { InitSPI0(); // ��ʼ��SPI0 InitSPI1(); // ��ʼ��SPI1 InitTLV5638(); // ��ʼ��оƬTLV5638 HardOverCurrentDataSet(3000, 3000); } // ======================================================================== // �������ƣ�InitSPI0 // ����������� // ����������� // ���룺�� // �������� // �������ܣ���ʼ��SPI0 // ======================================================================== static void InitSPI0(void) { XSpiPs_Config *SpiConfig; SpiConfig = XSpiPs_LookupConfig(SPI_DEVICE_0_ID); // ��������ID����������Ϣ XSpiPs_CfgInitialize(&Spi0, SpiConfig, SpiConfig->BaseAddress); // ��ʼ���������� XSpiPs_SelfTest(&Spi0); // Ӳ���Լ� XSpiPs_SetOptions(&Spi0, XSPIPS_MASTER_OPTION | XSPIPS_CLK_PHASE_1_OPTION); // ����ģʽѡ����Ҫ�漰ʱ�Ӽ��Ժ���λ���ԣ���������ģʽ XSpiPs_SetClkPrescaler(&Spi0, SPI_CLK_PRESCALE); // ���÷�Ƶϵ�� XSpiPs_Enable(&Spi0); // ʹ��ͨ�� } // ======================================================================== // �������ƣ�InitSPI1 // ����������� // ����������� // ���룺�� // �������� // �������ܣ���ʼ��SPI1 // ======================================================================== static void InitSPI1(void) { XSpiPs_Config *SpiConfig; SpiConfig = XSpiPs_LookupConfig(SPI_DEVICE_1_ID); // ��������ID����������Ϣ XSpiPs_CfgInitialize(&Spi1, SpiConfig, SpiConfig->BaseAddress); // ��ʼ���������� XSpiPs_SelfTest(&Spi1); // Ӳ���Լ� XSpiPs_SetOptions(&Spi1, XSPIPS_MASTER_OPTION | XSPIPS_CLK_PHASE_1_OPTION); // ����ģʽѡ����Ҫ�漰ʱ�Ӽ��Ժ���λ���ԣ���������ģʽ XSpiPs_SetClkPrescaler(&Spi1, SPI_CLK_PRESCALE); // ���÷�Ƶϵ�� XSpiPs_Enable(&Spi1); // ʹ��ͨ�� } // ======================================================================== // �������ƣ�SPI0_DataSend // ����������� // ����������� // ���룺�� // �������� // �������ܣ�SPI0���ݷ��� // ======================================================================== void SPI0_DataSend(Uint16 Data) { XSpiPs_WriteReg(Spi0.Config.BaseAddress, XSPIPS_TXD_OFFSET, (Uint32)(Data >> 8)); XSpiPs_WriteReg(Spi0.Config.BaseAddress, XSPIPS_TXD_OFFSET, (Uint32)Data); } // ======================================================================== // �������ƣ�SPI1_DataSend // ����������� // ����������� // ���룺�� // �������� // �������ܣ�SPI1���ݷ��� // ======================================================================== void SPI1_DataSend(Uint16 Data) { XSpiPs_WriteReg(Spi1.Config.BaseAddress, XSPIPS_TXD_OFFSET, (Uint32)(Data >> 8)); XSpiPs_WriteReg(Spi1.Config.BaseAddress, XSPIPS_TXD_OFFSET, (Uint32)Data); } // ======================================================================== // �������ƣ�SPI0_DataRead // ����������� // ����������� // ���룺�� // �������� // �������ܣ�SPI0���ݶ�ȡ // ======================================================================== //static Uint8 SPI0_DataRead(void) //{ // return (Uint8)XSpiPs_ReadReg(Spi0.Config.BaseAddress, XSPIPS_RXD_OFFSET); //} // ======================================================================== // �������ƣ�SPI1_DataRead // ����������� // ����������� // ���룺�� // �������� // �������ܣ�SPI1���ݶ�ȡ // ======================================================================== //static Uint8 SPI1_DataRead(void) //{ // return (Uint8)XSpiPs_ReadReg(Spi1.Config.BaseAddress, XSPIPS_RXD_OFFSET); //} // ======================================================================== // �������ƣ�InitTLV5638 // ����������� // ����������� // ���룺�� // �������� // �������ܣ�оƬTLV5638��ʼ�� // ======================================================================== static void InitTLV5638(void) { Uint16 SPISendData = 0; // ���òο���ѹ��ģʽ SPISendData = (DAC_WITE_CONTROL << 12) | (DAC_PWR_MODE << 13) | (DAC_SPEED_MODE << 14) | DAC_REF_SELECT; SPI0_DataSend(SPISendData); SPI1_DataSend(SPISendData); Delay(400); } //======================================================================== // �������ƣ�HardOverCurrentDataSet // ����������� // ����������� // ���룺�� // �������� // �������ܣ�����Ӳ���������� // ======================================================================== void HardOverCurrentDataSet(Uint16 VoutA, Uint16 VoutB) { Uint16 SPISendData = 0; // д���ݵ�BUFFER SPISendData = (DAC_WITE_BUFFER << 12) | (DAC_PWR_MODE << 13) | (DAC_SPEED_MODE << 14) | VoutB; SPI0_DataSend(SPISendData); SPI1_DataSend(SPISendData); Delay(400); // ����ͨ��A��ѹ��ͬʱ�ӻ���Ĵ����и���Bͨ����ѹ SPISendData = (DAC_WITE_A_B << 12) | (DAC_PWR_MODE << 13) | (DAC_SPEED_MODE << 14) | VoutA; SPI0_DataSend(SPISendData); SPI1_DataSend(SPISendData); Delay(400); } // ======================================================================== // �������ƣ�VolToData // ����������� // ����������� // ���룺�� // �������� // �������ܣ���ѹת�������� // ======================================================================== //static Uint16 VolToData(Uint8 RefMode, float32 ExRef, float32 Vol) //{ // Uint16 temp; // // switch (RefMode) // { // case DAC_EXTERNAL: // temp = (Uint16)((Vol * 4096) / (2 * ExRef)); // break; // case DAC_IN_1024: // temp = (Uint16)((Vol * 4096) / (2 * 1.024)); // break; // case DAC_IN_2048: // temp = (Uint16)((Vol * 4096) / (2 * 2.048)); // break; // default: // temp = 0; // break; // } // return (temp & 0x0FFF); //}
说明.txt
附件是TLV5638控制的SPI部分代码,目前无法实现A、B两通道同时输出电压,控制发了3个16的波形,其中第一个波形设置基准电压,实际测量正确;第二个波形时写数值到BUFFER,目前不正常;第三个波形是设置A通道数值且从BUFFER更新数值至B通道,实测B通道输出不正常,A通道输出正常。麻烦协助解决两通道同同时输出问题。
Amy Luo:
您好,
Xu Allen 说:如果将第三个波形放到第二个波形,再增加新的第三个波形,即设置B通道数值以及更新BUFER,则A通道无输出,B通道有输出。
您的意思是说总是第二个波形不起作用?
在D0在SCLK下降沿被采样后,还需要一个SCLK的上升沿以更新输出,看您的波形都少了一个SCLK上升沿不知道跟这个有关不,建议加上一个SCLK上升沿看两通道是否可以正常输出?