目前手上一款款ADS1292R芯片
我始终无法get到ID,然后程序使用的SPI程序是验证过可以使用的。
下面是初始化程序:
使用的内部晶振
有谁可以帮忙看一看,急![](static/image/smiley/default/cry.gif)
void Delayms(unsigned long nus)
{
int m;
for(m=0;m<nus*10000;m++);
}
void Delayus(unsigned long nus)
{
int m;
for(m=0;m<nus*1000;m++);
}
void ADS1292R_Init(void)
{
ADS1292R_CS_H;
ADS1292R_START_L;
ADS1292R_PWDN_H;
//*/filter_bp17_init(); //DSP滤波器初始化
}
uint8_t ADS1292R_SPI_RW(uint8_t data)
{
uint8_t rx_data = 0;
//*/HAL_SPI_TransmitReceive(&SPI1_Handler, &data, &rx_data, 1, 10);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET)
{
;
}
SPI_SendData8(SPI1,data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET)
{
;
}
rx_data = SPI_ReceiveData8(SPI1);
return rx_data;
}
/**ADS1292R上电复位 **/
uint8_t device_id ;
void ADS1292R_PowerOnInit(void)
{
ADS1292R_START_H;
ADS1292R_CS_L;
ADS1292R_PWDN_L;//进入掉电模式
Delayms(1000);
ADS1292R_PWDN_H;//退出掉电模式
Delayms(1000);//等待稳定
ADS1292R_PWDN_L;//发出复位脉冲
Delayms(10);
ADS1292R_PWDN_H;
Delayms(1000);//等待稳定,可以开始使用ADS1292R
ADS1292R_START_L;
ADS1292R_CMD(ADS1292R_SDATAC);//发送停止连续读取数据命令
Delayms(1);
while(device_id!=0x73) //识别芯片型号,1292r为0x73
{
device_id = ADS1292R_REG(ADS1292R_RREG|ADS1292R_ID,0X00);
Delayms(200);
}
//*/OLED_PrintfString(0,2,"ADS1292R Detected");
ADS1292R_REG(ADS1292R_WREG|ADS1292R_CONFIG2, 0XE0); //使用内部参考电压
Delayms(10);//等待内部参考电压稳定
ADS1292R_REG(ADS1292R_WREG|ADS1292R_CONFIG1, 0X02); //设置转换速率为500SPS
//ADS1292R_REG(ADS1292R_WREG|ADS1292R_CONFIG1, 0X00); //设置转换速率为125SPS
ADS1292R_REG(ADS1292R_WREG|ADS1292R_LOFF, 0XF0);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_CH1SET, 0X00);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_CH2SET, 0x00);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_RLD_SENS, 0x30);
// ADS1292R_REG(ADS1292R_WREG|ADS1292R_RLD_SENS, 0x3C); //使用通道2提取共模电压
ADS1292R_REG(ADS1292R_WREG|ADS1292R_LOFF_SENS, 0x3F);
// ADS1292R_REG(ADS1292R_WREG|LOFF_STAT, 0X00);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_RESP1, 0xDE);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_RESP2, 0x07);
ADS1292R_REG(ADS1292R_WREG|ADS1292R_GPIO, 0x0C);
}
void ADS1292R_Work(void)
{
//*/OLED_PrintfString(0,2,"ADS1292R Working");
ADS1292R_CMD(ADS1292R_RDATAC);//回到连续读取数据模式,检测噪声数据
ADS1292R_START_H;//启动转换
//中断线1-PB1
//*/HAL_NVIC_SetPriority(EXTI1_IRQn,1,1); //抢占优先级为1,子优先级为1
//*/HAL_NVIC_EnableIRQ(EXTI1_IRQn); //使能中断线1
}
void ADS1292R_Halt(void)
{
//*/OLED_PrintfString(0,2,"ADS1292R Halt");
ADS1292R_START_L;//启动转换
ADS1292R_CMD(ADS1292R_SDATAC);//发送停止连续读取数据命令
//*/HAL_NVIC_DisableIRQ(EXTI1_IRQn); //关闭中断线1
}
//对ADS1292R写入指令
void ADS1292R_CMD(uint8_t cmd)
{
ADS1292R_CS_L;
Delayus(1);
ADS1292R_SPI_RW(cmd);
Delayus(1);
ADS1292R_CS_H;
}
//对ADS1292R内部寄存器进行操作
uint8_t ADS1292R_REG(uint8_t cmd, uint8_t data) //只读一个数据
{
uint8_t rx_data = 0;
ADS1292R_CS_L;
Delayus(1);
ADS1292R_SPI_RW(cmd); //读写指令
ADS1292R_SPI_RW(0X00); //需要写几个数据(n+1个)
if((cmd&0x20)==0x20) //判断是否为读寄存器指令
rx_data = ADS1292R_SPI_RW(0X00); //返回寄存器值
else
rx_data = ADS1292R_SPI_RW(data); //写入数值
Delayus(1);
ADS1292R_CS_H;
return rx_data;
}
static uint8_t temp1292r[9] = {0}; //并没有什么卵用
/*读取72位的数据1100+LOFF_STAT[4:0]+GPIO[1:0]+13个0+2CHx24位,共9字节*/
uint8_t temp=0;
void ADS1292R_ReadData(void)
{
ADS1292R_CS_L;
// HAL_SPI_TransmitReceive(&SPI1_Handler, temp1292r, ads1292r_data_buff, 9, 10);
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET)
// {
// ;
// }
// SPI_SendData8(SPI1,data);
//
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET)
{
;
}
temp = SPI_ReceiveData8(SPI1);
ADS1292R_CS_H;
}
|