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];
}