This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TLV5638: 技术咨询

Part Number: TLV5638

你好,

     目前使用芯片TLV5638时,遇到无法实现AB两通道同时输出电压的问题,控制发了316的波形,其中第一个波形设置基准电压,实际测量正确;第二个波形时写数值到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通道输出正常。麻烦协助解决两通道同同时输出问题。

  • 您好,

    如果将第三个波形放到第二个波形,再增加新的第三个波形,即设置B通道数值以及更新BUFER,则A通道无输出,B通道有输出。

    您的意思是说总是第二个波形不起作用?

    在D0在SCLK下降沿被采样后,还需要一个SCLK的上升沿以更新输出,看您的波形都少了一个SCLK上升沿不知道跟这个有关不,建议加上一个SCLK上升沿看两通道是否可以正常输出?