AMC131M03-Q1: AMC131M03-Q1的SPI驱动MISO没有数据返回

Part Number: AMC131M03-Q1

我使用Infineon的XMC4502与 AMC131M03-Q1通过SPI连接。SCLK、MOSI、CS和CLKIN均得到正常的波形,但是MISO没有任何数据返回。

目前我们先希望调通SPI,下一步再调试ADC。

  1. SCLK设定为4MHz。
  2. SPI工作模式设定为CPOL=0且CPHA=1。
  3. CLKIN设定位8MHz。
  4. 上电后没有对AMC131M03-Q1进行配置,完全依赖于AMC131M03-Q1上电复位后的缺省配置。
  5. 上电后延时一秒,开始以10ms为周期性地读取ID寄存器。

 

下面是原理图:

sch.jpg

下面是相关代码

static void SPI_Transceive_Frame(void)
{
	SPI_CS_VALID();
	for (int i=0; i<SPI_FRAME_SIZE; ++i) {
	    XMC_SPI_CH_Transmit(SPI_TI_HW, CMD_Buffer.TX_Buffer[i], XMC_SPI_CH_MODE_STANDARD);
	    while((XMC_SPI_CH_GetStatusFlag(SPI_TI_HW) & XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION) == 0U);
	    XMC_SPI_CH_ClearStatusFlag(SPI_TI_HW, XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION);
		CMD_Buffer.RX_Buffer[i] = (uint8_t)XMC_SPI_CH_GetReceivedData(SPI_TI_HW);
	}
	SPI_CS_INVALID();
}

//无操作命令,为了读取状态寄存器。
static void SPI_CMD_NULL(void)
{
	for (int i=0; i<SPI_FRAME_SIZE; ++i)
		CMD_Buffer.TX_Buffer[i] = 0;

	SPI_Transceive_Frame();
}

//一次只允许写一个寄存器,以保持帧长度固定。
static void SPI_CMD_WREG(uint8_t addr, uint16_t value)
{
	uint16_t cmd = 0x6000;

	cmd |= (uint16_t)addr << 7;
	CMD_Buffer.TX_Buffer[0] = (uint8_t)(cmd >> 8);
	CMD_Buffer.TX_Buffer[1] = (uint8_t)cmd;
	CMD_Buffer.TX_Buffer[2] = (uint8_t)(value >> 8);
	CMD_Buffer.TX_Buffer[3] = (uint8_t)value;

	for (int i=4; i<SPI_FRAME_SIZE; ++i)
		CMD_Buffer.TX_Buffer[i] = 0;

	SPI_Transceive_Frame();	//发送命令
	SPI_CMD_NULL();		//接收寄存器的值
}

//一次只允许读一个寄存器,以保持帧长度固定。
uint16_t SPI_CMD_RREG(uint8_t addr)
{
	uint16_t cmd = 0xa000;

	cmd |= (uint16_t)addr << 7;
	CMD_Buffer.TX_Buffer[0] = (uint8_t)(cmd >> 8);
	CMD_Buffer.TX_Buffer[1] = (uint8_t)cmd;
	
	for (int i=2; i<SPI_FRAME_SIZE; ++i)
		CMD_Buffer.TX_Buffer[i] = 0;

	SPI_Transceive_Frame();	//发送命令
	SPI_CMD_NULL();		//接收寄存器的值
	
	return ((uint16_t)CMD_Buffer.RX_Buffer[0] << 8) | CMD_Buffer.RX_Buffer[1];
}

uint16_t SPI_Read_Status(void)
{
	SPI_CMD_NULL();		//接收寄存器的值

	return ((uint16_t)CMD_Buffer.RX_Buffer[0] << 8) | CMD_Buffer.RX_Buffer[1];
}

 

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,

        您的电路图没看出什么问题。感觉像芯片没有正确的上电复位,RESET信号是FPGA控制的,低电平时间是否足够。

        您并没有引出DRDY,这个脚可以指示芯片初始化状态。

        请参考数据手册“6.11 Timing Diagrams” 检查各个时序

        

  • 谢谢您的回复!我们再仔细检查RESET和SPI的波形,以满足 AMC131M03-Q1的时序要求。

  • 您好!

    谢谢您的指导!

    现在SPI已经调通,成功读到了ID寄存器的值为0x2312。

    SPI配置为:SCLK为2.25MHz, CPOL=0且CPHA=1。

    1. 目前CLKIN为4.096MHz。
    2. MODE寄存器没动,使用复位后的缺省值。则字长为24位。整个SPI收发的数据长度为15字节。
    3. CLOCK寄存器配置为0x70D,则为低功耗模式,因为CLKIN为4.096MHz。
    4. GAIN寄存器配置为0x444,则增益为16,其FSR为75mV。我们输入电压最大为1000V,转换后给131的AD输入电压最大为55mV。
    5. DCDC_CTRL 寄存器配置为0x0x801。
    6. 通过NULL命令不断地读取状态寄存器来获得AD值。
    7. 当状态寄存器中DRDY0为1,则将收到的第3、4、5字节合并为一个32位整数,第3字节为MSB,第5字节为LSB,并作为通道0的AD值。
    8. 状态寄存器中DRDY1为1,则将收到的第6、7、8字节合并为一个32位整数,第6字节为MSB,第8字节为LSB,并作为通道1的AD值。
    9. 状态寄存器中DRDY2为1,则将收到的第9、10、11字节合并为一个32位整数,第9字节为MSB,第11字节为LSB,并作为通道2的AD值。
    10. 调试时,我们的输入电压为0~300V,测量131的管脚9和管脚10之间的电压为0~18mV。

    目前我们碰到的问题是无论输入电压如何调整,读出来的AD值均为0,但是测量131的管脚9和管脚10之间的电压的确随着输入电压而变化。

    希望继续得到您的指导!

            谢谢!

     

  • 您好,

         为方便其它用户检索,新问题请重新发帖,专题讨论。

  • 好的。谢谢!