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.
我的数字电源和模拟电源都为3.3V, CAP引脚是否应该有1.8V输出呢?
我用STM32F407 的PWM输出占空比为50%的信号作为CLKIN,CLKIN为4MHz;SPI CLK配置为 低电平 下降沿有效2.5Mhz 8位 MSB模式 但无论发什么指令器件都没回应,CAP引脚为0V。我用示波器观测CLKIN SCLK 和DIN波形都正常。RESET为高电平 CS直接配置为始终低电平。
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
setCS(LOW);
InitADC();
// EXTI6_Enable();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// writeSingleRegister(GAIN1_ADDRESS, 0x0003);//通道0 GAIN = 8
// sendCommand(OPCODE_UNLOCK);
//
// readData(&DataStruct);
spiSendReceiveByte(0x00);
spiSendReceiveByte(0x33);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);
LL_mDelay(1);
}
void InitADC(void)
{
// IMPORTANT: Make sure device is powered before setting GPIOs pins to HIGH state.
// Initialize GPIOs pins used by ADS131M0x
// Initialize SPI peripheral used by ADS131M0x
MX_SPI1_Init();
LL_SPI_Enable(SPI1);
// Run ADC startup function
adcStartup();
}
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
SPI_InitStruct.CRCPoly = 10;
LL_SPI_Init(SPI1, &SPI_InitStruct);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);
void adcStartup(void)
{
/* (OPTIONAL) Provide additional delay time for power supply settling */
setSYNC_RESET(LOW);
LL_mDelay(50);
/* (REQUIRED) Set nRESET pin high for ADC operation */
setSYNC_RESET(HIGH);
LL_mDelay(1);
您好,
是的,CAP 电压应该为1.8V.
CAP引脚为0V
这是不正常的,检查下供电是否正常、焊接是否有问题,或多测试几块板子CAP 都是0V 吗?
DIN 在SCLK 下降沿采样,DOUT 在SCLK 上升沿发送。
建议你先解决下CAP 为0 的问题,再看通信问题。
你好,现在 CAP引脚电压正常了是吗?可以分享出是什么原因CAP电压异常的吗?
在datasheet 8.5.1.10.8 WREG (011a aaaa annn nnnn)有寄存器写入时序图,你看下,默认CRC是disabled,4个ADC通道是使能的。建议你捕捉下写寄存器时序图看下哪里有异常。
怎样才能进入short frame 模式呢?
这个需要你配置寄存器,disable 4个ADC通道。
能写入,我是通过RESET引脚复位后,直接写入模式寄存器配置为16位工作方式(0x0010,好像生效了,共发出18个字节SPI时钟),等待ready'引脚变低,再配置clock(只开通道0,发了12个字节SPI时钟,在前两个字节,收到回复0x41),在等待ready'引脚变低,在写入寄存器。。。一系列操作下来,我利用官方提供的读取数据函数(readData(&DataStruct_AD))无法正确读取数据。
我想只开通道0,那么读取数据是不是也需要发 完整的3*6字节(18个字节)SPI时钟啊?如果工作在16位模式的话,就需要发送12个字节SPI读时钟?是不是我的改写readData(&DataStruct_AD)函数,因为它只发了6个字节SPI时钟,少发了6个?
你的问题可能是SPI 帧长的问题,建议你看下datasheet 8.5.1.7 SPI Communication Frame章节。
SPI 帧长一般是6个字,DIN的话,6个字包括一个命令字,一个CRC(CRC disable的话那么发送0s)字,再加4个字的0s;
DOUT 的话6个字包括一个响应字,4个ADC输出字,加CRC字。
一个字包含的字节数与寄存器 WLENGTH[1:0] bits设置有关,默认24bits。
读取寄存器的话,如果需要读取多个寄存器值,那么通信帧长就多于6个字了。
我想只开通道0,那么读取数据是不是也需要发 完整的3*6字节(18个字节)SPI时钟啊?如果工作在16位模式的话,就需要发送12个字节SPI读时钟?是不是我的改写readData(&DataStruct_AD)函数,因为它只发了6个字节SPI时钟,少发了6个?
应该是这里的问题。
我没研究代码例程,我不明白:只转换通道0的话,读取数据只需4个字
你可以配置为 short frame 模式吗?即disable 掉所有通道,然后看是否可以读取寄存器值。disable 掉所有通道就不进行AD 转换了,就没有转换结果输出了。
writeSingleRegister(CLOCK_ADDRESS, 0x000E);//关通道
writeSingleRegister(GAIN1_ADDRESS, 0x0002);//通道0 GAIN = 2;
// writeSingleRegister(THRSHLD_LSB_ADDRESS, 0x0002);//High_Pass -3db 84.8Hz;
writeSingleRegister(CLOCK_ADDRESS, (CLOCK_DEFAULT & ~CLOCK_OSR_MASK) | CLOCK_OSR_256);//开通道0,采集速度16K
/* (OPTIONAL) Read back all registers */
/* (OPTIONAL) Check STATUS register for faults */
ReadData_AD(&DataStruct_AD);
ReadData_AD(&DataStruct_AD);
EXTI6_Enable();//初始化后,我先读两次数据再开中断
中断程序中
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6) != RESET)
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
/* USER CODE BEGIN LL_EXTI_LINE_6 */
EXTI6_Disable();//关中断
ReadData_AD(&DataStruct_AD);//读数据
Flag_DataReady_AD = 1;
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
EXTI6_Enable();//开中断
/* USER CODE END LL_EXTI_LINE_6 */
}