你好,
目前使用芯片TLV5638时,遇到无法实现A、B两通道同时输出电压的问题,控制发了3个16的波形,其中第一个波形设置基准电压,实际测量正确;第二个波形时写数值到BUFFER,目前不正常;第三个波形是设置A通道数值且从BUFFER更新数值。如果将第三个波形放到第二个波形,再增加新的第三个波形,即设置B通道数值以及更新BUFER,则A通道无输出,B通道有输出。请问一下,是什么原因导致的呢?
// ==================�������Ȩ��������Ը�����Ƽ�����˾����===================
// �ļ����ƣ�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);
//}
附件是TLV5638控制的SPI部分代码,目前无法实现A、B两通道同时输出电压,控制发了3个16的波形,其中第一个波形设置基准电压,实际测量正确;第二个波形时写数值到BUFFER,目前不正常;第三个波形是设置A通道数值且从BUFFER更新数值至B通道,实测B通道输出不正常,A通道输出正常。麻烦协助解决两通道同同时输出问题。