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.

[参考译文] AFE4300:AFE4300 SPI读写问题

Guru**** 2530360 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/665268/afe4300-afe4300-spi-read-write-issue

部件号:AFE4300

我在让tiAFE4300启动ADC测量时遇到问题。 我开始使用一款使用TI的参考设计设计设计的新主板。 正在尝试通过stm32f103rbt6与主板通信。

我设置了SPI模式1,想要使用身体成分测量(BCM)。

我通过ARM PWM信号给4300电路板提供1MHz的安全信号。

这就是发生的情况

1.我无法读取ADC数据结果寄存器。  

2. RDY引脚状态保持不变。保持高状态。

 

 

INT MAIN ()

SystemInit();
UART2_Init();
DelayInit();
PWM_Init();



reset_init();
INIT_SPI1();

resetAFE4300();
initAFE4300();
initBCM();

//
同时(1)


IF(GPIO_ReadInputDataBit(GPIOC,PIN_DRDY)== 1){

printf ("register_Name\n\n");
printf ("0x%X\n\n",readRegister (ADC_DATA_Result));
printf ("0x%X\n\n",readRegister (ADC_CONTINT_REGISTER));
printf ("0x%X\n\n",readRegister (MISC1_REGISTER));
printf ("0x%X\n\n",readRegister (MISC2_REGISTER));
printf ("0x%X\n\n",readRegister (device_control_1));
printf ("0x%X\n\n",readRegister (ISW_Matrix));
printf ("0x%X\n\n",readRegister (VSW_Matrix));
printf ("0x%X\n\n",readRegister (IQ) MODE_ENABLE);
printf ("0x%X\n\n",readRegister (weight_scale_control));
printf ("0x%X\n\n",readRegister (BCM_DAC_FREQ));
printf ("0x%X\n\n",readRegister (device_control_2));
printf ("0x%X\n\n",readRegister (ADC_CONTINT_REGISTER_2));
printf ("0x%X\n\n",readRegister (MISC3_REGISTER));

}
否则,如果(GPIO_ReadInputDataBit(GPIOC,PIN_DRDY)== 0){
//printf ("%0x\n\n",readRegister (ADC_DATA_Result));
printf ("低\n\r");
}
DelayMs(100);
}
}

void reset_init(void){
GPIO _输入类型Def GPIO _输入结构;

//GPIO_PinRemapConfig (GPIO_Remap_SWJ_NoJTRST,启用);
//GPIO_PinRemapConfig (GPIO _Remap_SWJ_JTAGDisable,启用);

/*启用GPIO时钟*/
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,启用);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,启用);

/*配置GPIO引脚*/
GPIO _InitStructure.GPIO针脚= PIN_RESET;
GPIO _InitStructure.GPIO模式= GPIO模式输出PP;
GPIO _InitStructure.GPIO _速度= GPIO _速度_50MHz;
GPIO_Init (GPIOC,&GPIO _InitStructure);  

GPIO _InitStructure.GPIO针脚= SPI_CS_PIN;
GPIO _InitStructure.GPIO模式= GPIO模式输出PP;
GPIO _InitStructure.GPIO _速度= GPIO _速度_50MHz;
GPIO _初始化(GPIOA,&GPIO _初始结构);

GPIO _InitStructure.GPIO针脚= PIN_DRDY;
GPIO _InitStructure.GPIO模式= GPIO模式IPD;
GPIO _InitStructure.GPIO _速度= GPIO _速度_50MHz;
GPIO_Init (GPIOC,&GPIO _InitStructure);
//
GPIO设置位(GPIOA, GPIO引脚_4);
}

UINT32_t RDY_READ(void){
返回GPIO_ReadInputDataBit(GPIOC,PIN_DRDY);
}

void reset_high (void){
//GPIOA->BSRR = PIN_RESET;  
GPIO设置位(GPIOC,PIN_RESET);
}

void reset_low (void){
//GPIOA->BRR = PIN_RESET;  

GPIO重置位(GPIOC,PIN_RESET);
}

void resetAFE4300 (void){
reset_low();
//printf ("111");
DelayMs(100);
reset_high ();
}


主模式的void init_SPI1(void){//
GPIO _输入类型Def GPIO _输入结构;
SPI_InitTypeDef SPI_InitStructure;
// gPIO_StructInit (& gPIO_InitStructure);
// SPI_StructInit (& SPI_InitStructure);

/*启用GPIOs时钟*/
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,启用);

/*启用SPI时钟*/
RCC_APB2PeriphClockCmd (RCC_APB2Periph_SPI1,启用);

/*配置SPI SCK引脚*/  
GPIO _InitStructure.GPIO针脚= SPI_SCK_PIN | SPI_MOSI_PIN | SPI_Miso_PIN;
GPIO _InitStructure.GPIO模式= GPIO模式_AF_PP;
GPIO _InitStructure.GPIO _速度= GPIO _速度_50MHz;
GPIO _初始化(GPIOA,&GPIO _初始结构);


/* SPI配置---------------------------------- */

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;//32
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1,&SPI_InitStructure);

/*启用SPI */
SPI_Cmd (SPI1,启用);

}

void writeRegister (unsigned char地址,unsigned int数据){
unsigned char firstByte =(unsigned char)(data >> 8);
unsigned char secondByte =(unsigned char)数据;  

GPIO重置位(GPIOA, GPIO引脚_4);

SPI_SendByte (地址);

SPI_SendByte(firstByte);
SPI_SendByte (secondByte);

GPIO设置位(GPIOA, GPIO引脚_4);
}

int readRegister (无符号字符地址){

Int spiReceive=0;
UINT8_t spiReceiveFirst = 0;
UINT8_t spiReceiveSecond = 0;

地址=地址和0x1F;//最后5位指定地址
address = address | 0x20;//前3位需要为001才能读取操作码

GPIO重置位(GPIOA, GPIO引脚_4);  

SPI_SendByte (地址);
spiReceiveFirst = SPI_SendByte(0x00);
spiReceiveSecond = SPI_SendByte(0x00);

GPIO设置位(GPIOA, GPIO引脚_4);

spiReceivive =(spiReceiveFirst <8);
spiReceive|| spiReceiveSecond;

返回spiReceiv;
}


void initAFE4300 (void)

writeRegister (ADC_CONTINT_REGISTER,0x5140);
writeRegister (MISC1_register,0x0000);//
writeRegister (MISC2_REGISTER,0xFFFF);//
writeRegister (device_control_1,0x0004);//关闭两个信号链
writeRegister (ISW_Matrix,0x0000);
writeRegister (VSW_Matrix,0x0000);
writeRegister (IQ_MODE_ENABLE,0x0000);//
writeRegister (weight_scale_control,0x0000);
writeRegister (BCM_DAC_FREQ,0x0040);//
writeRegister (device_control_2,0x0000);
writeRegister (ADC_CONTINT_REGISTER_2,0x0011);
writeRegister (MISC3_register,0x00C0);
}

void initBCM(void)

writeRegister (ADC_CONTROL_REGISTER,0x4120);//差分测量模式,32 SPS //4120//C1A0
writeRegister (device_control_1,0x0006);//启动BCM信号链
writeRegister (ISW_Matrix,0x0408);//通道IOUTP1和IOUTN0
writeRegister (VSW_Matrix,0x0408);//通道VSENSEP1和VSENSEN0
writeRegister (ADC_CONTINT_REGISTER_2,0x0063);//ADC选择BCM-I输出的输出
writeRegister (weight_scale_control,0x0000);//增益= 1 DAC偏移= 0 0x603F
writeRegister (BCM_DAC_FREQ,0x0032);
writeRegister (MISC3_register,0x0030);
}

UINT8_t SPI_SendByte (uint8_t数据)

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)== RESET;
SPI_I2S_SendData (SPI1, Data);  
While (SPI_I2S_GetFlagStatus (SPI1,SPI_I2S_FLAG_RXNE)== RESET);

返回SPI_I2S_ReceiveData(SPI1);
}

任何潜在客户都将有很大帮助

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,RAM:

    您可以先验证SPI写入吗? 您可以在启用体重秤信号链之前和之后测量VLDO电压。
    如果未观察到VLDO中的变化,则不会发生SPI写入。 要对此进行调试,请使用模拟示波器探测所有SPI信号,从而验证(并共享)所有SPI信号。

    此致,
    Prabin