Part Number:ADS1299EEGFE-PDKOther Parts Discussed in Thread:ADS1299, ADS1292,
孩子最近刚学spi,想测下内部测试方波,下面是ad芯片上spi四根线的连接,还有根clksel接的是是上面那排最右边(拉低拉高我都试了),/pwdn没拍进去,我拉高了。
我按照figure67来的,使用mmb0供电
上面第四个连的SPI的MISO,第五根连的MISI,下面第四根连的SCK,JP21那里连的是CS,我用的开发板是stm32H7
/*SPI接口初始化*/
__HAL_SPI_DISABLE(&SPI3_Handler);
SPI_InitStructure_ADS.Direction = SPI_DIRECTION_2LINES; //双线双向全双工
SPI_InitStructure_ADS.Mode = SPI_MODE_MASTER; //SPI主模式
SPI_InitStructure_ADS.DataSize = SPI_DATASIZE_8BIT; //8bit数据
SPI_InitStructure_ADS.CLKPolarity=SPI_POLARITY_LOW; //串行同步时钟的空闲状态为高电平
SPI_InitStructure_ADS.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure_ADS.NSS = SPI_NSS_PULSE_DISABLE; //片选用软件控制
SPI_InitStructure_ADS.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; SPI_InitStructure_ADS.FirstBit = SPI_FIRSTBIT_MSB; //高位在前
SPI_InitStructure_ADS.CRCPolynomial = 7; //crc7,stm32spi带硬件ecc
HAL_SPI_Init(&SPI3_Handler);
__HAL_SPI_ENABLE(&SPI3_Handler);
}
/**ADS1299上电复位 **/
void ADS_PowerOnInit(void)
{
SPI_CS_LOW;
delay_ms(1000);
ADS_SPI(ADS_RESET); delay_ms(1000);
ADS_SPI(SDATAC);
delay_ms(1000);
ADS_REG(WREG|CONFIG3,0XE0); ADS_REG(WREG|CONFIG1,0X96);
ADS_REG(WREG|CONFIG2,0XD0);
ADS_REG(WREG|CH1SET,0X01); ADS_REG(WREG|CH2SET,0X01); ADS_REG(WREG|CH3SET,0X01); ADS_REG(WREG|CH4SET,0X01); ADS_REG(WREG|CH5SET,0X01); ADS_REG(WREG|CH6SET,0X01); ADS_REG(WREG|CH7SET,0X01); ADS_REG(WREG|CH8SET,0X01); delay_ms(10);
SPI_CS_LOW;
ADS_SPI(START);
SPI_CS_HIGH;
}
/**对ADS129x内部寄存器进行操作 **/
unsigned char ADS_REG(unsigned char com,unsigned data)//第一次发读写命令还有寄存器地址,第二次发操作寄存器数,第三次发寄存器要改成的值
{
unsigned char i,data_return;
SPI_CS_LOW;//Low to communicated
for (i=0;i<45;i++);
ADS_SPI(com);
for (i=0;i<45;i++);
ADS_SPI(0X00);
for (i=0;i<45;i++);
if ((com&0x20)==0x20)//判断是否为读寄存器指令
{
data_return=ADS_SPI(0X00);
//for(i=0;i<45;i++); }
if ((com&0x40)==0x40)
{
data_return=ADS_SPI(data);
}
SPI_CS_HIGH;
return (data_return);
}
/**通过SPI总线与ADS1292通信**/
unsigned char ADS_SPI(unsigned char com)
{
unsigned char rec_data=0;
while (__HAL_SPI_GET_IT_SOURCE(&SPI3_Handler, SPI_FLAG_TXE)==0);//检测发送寄存器是否为空,上一个数据发送完成
HAL_SPI_Transmit(&SPI3_Handler, &com,1,10000);//发送数据 while (__HAL_SPI_GET_IT_SOURCE(&SPI3_Handler, SPI_FLAG_RXNE)==0)//检测接收标志是否非空,发送完成 {
HAL_SPI_Receive(&SPI3_Handler,&rec_data,1,10000);
}
return rec_data; //返回接收到的数据
}
上面是我用到的函数
然后,我运行
ADS_Init();
ADS_PowerOnInit();
经过上电复位,通过调试的软件观察到寄存器全部变成0,有的时候没有改变
Amy Luo:
您好,
建议您用示波器或者逻辑分析仪捕获SPI通信波形,然后查看发出的命令时序是否正确,这是调试SPI通信最好的方式。
下面FAQ中有SPI的调试步骤以及 ADS1299EEGFE-PDK的代码,希望对您有帮助:
[FAQ] Common Questions for TI's ADS129x Family of Bio-Potential ADCs