打印
[STM32F0]

STM32F030使用ADS1292R

[复制链接]
638|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
19996|  楼主 | 2020-9-17 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前手上一款款ADS1292R芯片
我始终无法get到ID,然后程序使用的SPI程序是验证过可以使用的。
下面是初始化程序:
使用的内部晶振
有谁可以帮忙看一看,急

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;

}

使用特权

评论回复
沙发
数据采集存储| | 2020-9-17 18:25 | 只看该作者
感谢楼主分享代码,学习了很多知识。不错的。

使用特权

评论回复
板凳
幸福小强| | 2020-9-17 22:13 | 只看该作者
怎么还自己写delay
HAL自带的delay很好。

使用特权

评论回复
地板
19996|  楼主 | 2020-9-19 16:20 | 只看该作者
数据采集存储 发表于 2020-9-17 18:25
感谢楼主分享代码,学习了很多知识。不错的。

这份代码是可以使用的,该问题已解决,是硬件错误

使用特权

评论回复
5
19996|  楼主 | 2020-9-19 16:21 | 只看该作者
幸福小强 发表于 2020-9-17 22:13
怎么还自己写delay
HAL自带的delay很好。

由之前的工程修改的,就随便写了一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

139

帖子

0

粉丝