主题中讨论的其他器件:AMC131M03、
工具与软件:
我正在使用 STM 微控制器来使用 SPI 来控制 AMC131M01DFMR。 我启用了直流/直流位、将 CIN 频率和分频器设置为默认值。 上电后、CIN 会提供连续时钟。 之后、发送 WRITE REGISTER (写入寄存器)和 READ REGISTER (读取寄存器)命令进行配置、仅启用直流/直流位、同时将所有其他命令保留为默认值。 但直流/直流输出端没有得到任何电压。 出现此问题的可能原因是什么?
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.
工具与软件:
我正在使用 STM 微控制器来使用 SPI 来控制 AMC131M01DFMR。 我启用了直流/直流位、将 CIN 频率和分频器设置为默认值。 上电后、CIN 会提供连续时钟。 之后、发送 WRITE REGISTER (写入寄存器)和 READ REGISTER (读取寄存器)命令进行配置、仅启用直流/直流位、同时将所有其他命令保留为默认值。 但直流/直流输出端没有得到任何电压。 出现此问题的可能原因是什么?
AMC131M03_WriteRead (0x04、0x31、AMCDataTx、AMCData);
if (counter < 1)
{
AMC131M03_WriteRead (0x03、0x31、AMCDataTx、AMCData);
AMCDataTx[0]= 0x01;
AMCDataTx[1]= 0x0D;
AMCDataTx[2]= 0x00;
AMC131M03_WriteRead (0x01、0x03、AMCDataTx、AMCData);
HAL_DELAY (1);
AMCDataTx[0]= 0x0A;
AMCDataTx[1]= 0x00;
AMCDataTx[2]= 0x00;
AMC131M03_WriteRead (0x01、0x31、AMCDataTx、AMCData);
HAL_DELAY (1);
AMCDataTx[0]= 0x0A;
AMCDataTx[1]= 0x01;
AMCDataTx[2]= 0x00;
AMC131M03_WriteRead (0x01、0x31、AMCDataTx、AMCData);
HAL_DELAY (1);
计数器++;
if (counter == 1)
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_8、GPIO_PIN_SET);
HAL_DELAY (1);
}
设计
uint8_t AMC131M03_WriteRead (uint8_t command、uint8_t reg、uint8_t * txData、uint8_t * rxData){
uint8_t txFrame[9]={0};// 10个16位块= 5个24位的字
uint8_t rxFrame[9]={0};//接收响应的大小相同
//准备命令字
uint16_t cmdWord = 0;
if (command =1){//写入命令
cmdWord =(0x6000)|((reg & 0x3F)<<7);
} else if (命令== 0){//读取命令
cmdWord =(0xA000)|((reg & 0x3F)<<7);
} else if (命令=3){//读取命令
cmdWord = 0x0000;
}
else if (command == 4){//读取命令
cmdWord = 0x11;
其他{
返回1;//无效命令
}
//填充传输帧
txFrame[0]=(cmdWord >> 8)& 0xFF;//命令高字节
txFrame[1]= cmdWord 和0xFF;//命令低字节
if (命令== 1)
{
for (int i =0;i < 3;i++)
{
txFrame[i + 3]= txData[i];
}
}
//构造输入帧(DIN 采用16位块)
// txFrame[0]= 0xB8;//((command << 8)| reg);//命令(8位)+寄存器(8位)
// txFrame[1]= 0x80;//添加或 CRC (如果禁用了 CRC)
// txFrame[2]= 0x0000;//对于第二个字为零(高16位)
// txFrame[3]= 0x0000;//对于第二个字为零(低8位被填充)
// txFrame[4]= 0x0000;//对于第三个字(高16位)为零
// txFrame[5]= 0x0000;//对于第三个字为零(低8位被填充)
// txFrame[6]= 0x0000;//对于第四个字(高16位)为零
// txFrame[7]= 0x0000;//对于第四个字为零(填充低8位)
// txFrame[8]= 0x0000;//对于第5个字(高16位)为零
// txFrame[9]= 0x0000;//对于第五个字为零(低8位带填充)
//事务1:发送命令帧、忽略响应
AMC131M01_CS_LOW ();
HAL_SPI_TRANSMIT (&hspi3、(uint8_t *) txFrame、9、HAL_MAX_DELAY);
AMC131M01_CS_HIGH ();
//等待响应准备就绪(取决于器件的延迟、根据需要调整)
// HAL_DELAY (1);//以1ms 延迟为例;按器件时序调整
//事务2:发送虚拟帧并接收响应
uint16_t dummyFrame[9]={0};//虚拟帧以随时钟输出响应
AMC131M01_CS_LOW ();
HAL_SPI_TransmitReceive (&hspi3、(uint8_t *) txFrame、(uint8_t *) rxFrame、9、HAL_MAX_DELAY);
AMC131M01_CS_HIGH ();
//将响应帧重构为每个24位的5个字
对于(int i = 0;i < 5;i++){
rxData[i]= rxFrame[i];
}
返回0;//成功
}
我将设置用于设置频率的命令。 发送这些命令。
感谢您的答复。
更改频率后、问题也未解决。 我认为沟通之间存在一些问题、因为我 观察到的反应不符合预期。 我将解释上面发布的带有 SPI 设置和数字响应的代码、我得到了这些代码、因此可以轻松地跟踪问题。 我只包含24位的响应、因为这是我的字大小、响应是稳定的、因此 SPI 初始化看起来是正确的。我认为问题在于发送的帧。
SPI 以781.25KHz 作为 MSB 优先的频率运行。 时钟的设置是极性低和相位第2沿。
命令序列如下所示:
上电后:
1.读取状态寄存器。
命令= 0x00000000000000 RESPONSE = 0x048000
2. 时钟寄存器所有 PWR =低功耗所有其他默认值
命令= 0x618000010D00000000响应= 0x410600
3. DCDC_CTRL 寄存器 DCDC_FREQ = 1.95 MHz 至2.12 MHz
命令= 0x788000080000000000 RESPONSE = 0x59FC00
4. DCDC_CTRL 寄存器 DCDC_EN =启用
命令= 0x788000080100000000 RESPONSE = 0x59FC00
5. 读取状态寄存器。
命令= 0x00000000000000 RESPONSE = 0x004000
我不知道原因、在这些命令之后、无论我发送什么命令、响应都保持为 0x004000