工具与软件:
我正在使用 STM32微控制器通过 SPI 控制 AMC131M03。 我无法按预期获得直流/直流输出。
CLK 频率为4MHz。
我要发送的命令如下:
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if (drady ==0)
{
if (counter < 1)
{
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if (drady ==0)
AMC131M03_WriteRead (0x03、0x31、AMCDataTx、AMCData);//读取状态寄存器
} while (drady =0);
HAL_DELAY (10);
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if(drady!=0)
AMC131M03_WriteRead (0x05、0x31、AMCDataTx、AMCData);//解锁要写入的寄存器
} while (drady =0);
HAL_DELAY (1000);
AMCDataTx[0]= 0x07;
AMCDataTx[1]= 0x01;
AMCDataTx[2]= 0x00;
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if(drady!=0)
AMC131M03_WriteRead (0x01、0x03、AMCDataTx、AMCData);//写入寄存器3启用所有通道 调制器过采样率128、 低功耗模式
} while (drady =0);
HAL_DELAY (1000);
AMCDataTx[0]= 0x08;
AMCDataTx[1]= 0x00;
AMCDataTx[2]= 0x00;
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if(drady!=0)
AMC131M03_WriteRead (0x01、0x31、AMCDataTx、AMCData);//写入寄存器31将直流/直流频率 1.95 MHz 设置为2.12 MHz
} while (drady =0);
HAL_DELAY (1000);
AMCDataTx[0]= 0x08;
AMCDataTx[1]= 0x01;
AMCDataTx[2]= 0x00;
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if(drady!=0)
AMC131M03_WriteRead (0x01、0x31、AMCDataTx、AMCData); //写入寄存器31启用直流/直流
} while (drady =0);
HAL_DELAY (1000);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_8、GPIO_PIN_RESET);
HAL_DELAY (1000);
计数器++;
if (counter == 1)
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_8、GPIO_PIN_SET);//打开 时钟
HAL_DELAY (1000);
}
设计
if (drady ==0)
{
AMC131M03_WriteRead (0x03、0x31、AMCDataTx、AMCData);//读取状态寄存器
HAL_DELAY (20);
}
}
uint8_t AMC131M03_WriteRead (uint8_t command、uint8_t reg、uint8_t * txData、uint8_t * rxData){
uint8_t txFrame[15]={0};// 10个16位块= 5个24位的字
uint8_t rxFrame[15]={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;
否则、如果(命令=5){
cmdWord = 0x655;
否则、如果(命令=6){
cmdWord = 0x555;
}
否则{
返回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:发送命令帧、忽略响应
AMC131M03_CS_LOW ();
HAL_SPI_TRANSMIT (&hspi3、(uint8_t *) txFrame、15、HAL_MAX_DELAY);
AMC131M03_CS_HIGH ();
// HAL_DELAY (1);
应执行的操作
{
drady = HAL_GPIO_ReadPin (GPIOE、GPIO_PIN_1);
if (drady ==1)
AMC131M03_CS_LOW ();
HAL_SPI_TransmitReceive (&hspi3、(uint8_t *) txFrame、(uint8_t *) rxFrame、15、HAL_MAX_DELAY);
AMC131M03_CS_HIGH ();
} while (drady =0);
//将响应帧重构为每个24位的5个字
对于(int i = 0;i < 8;i++){
rxData[i]= rxFrame[i];
}
返回0;//成功
}
我正在附加应用程序的图像。