Part Number: AMC131M03-Q1
我使用Infineon的XMC4502与 AMC131M03-Q1通过SPI连接。SCLK、MOSI、CS和CLKIN均得到正常的波形,但是MISO没有任何数据返回。
目前我们先希望调通SPI,下一步再调试ADC。
- SCLK设定为4MHz。
- SPI工作模式设定为CPOL=0且CPHA=1。
- CLKIN设定位8MHz。
- 上电后没有对AMC131M03-Q1进行配置,完全依赖于AMC131M03-Q1上电复位后的缺省配置。
- 上电后延时一秒,开始以10ms为周期性地读取ID寄存器。
下面是原理图:

下面是相关代码
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];
}
