技术热线: 0755-86643915

新闻动态

ADC芯片CS1237的芯片例程参考

更新时间: 2024-01-16 15:40:44
阅读量:


先说下cs1237时序:

操作流程:

         如果只是要读取adc的数据 很简单,读取data到低电平时 说明有数据来了, 控制时钟线发送24个脉冲,一边发送一边读取数据即可,但是要读取寄存器状态,和更改放大倍数,输出速率等参数的时候,需要在发送完24个时钟之后接着按照他给的要求发送和接收数据,这里就不一一解释了,贴段代码:

/* 
  读取ad数据
   number是要读取哪个
   select 为1时向寄存器写入数据  并且要吧写入的数据更改
   select 为2时读取寄存器数据
   select 为3时读取adc数据
*/
u32 CS1237Rx(u8 * number,u32 time_us, u8 select)
{
    static u32 protection;      //防止卡死在此函数
    static u8 i,a;
    static u32 data;
    static u8 data1;
  data1 = (number[0]&0x30)>>4; //判断哪个IO配置输入或输出
    data=0;
    protection=0X999999;          //等待超时 防止卡死
    /*此处应把读取的IO口置为输入模式  浮空输入*/
    CS1239_R_IO(data1);  //配置为输入
    while(Selectionfunction(number[4])) //读取data到低电平时 说明有数据来了
    {
        protection--;
        if(protection<=1)
        {
            return 0;                   //超过了时间data读取不到低电平,函数返回0表示错误
        }
    }
    
    for(i=0;i<24;i++)
    {
        a=24-i-1;
        Selectionfunction(number[1]);  //时钟高电平
        delay_us(time_us);
        if(Selectionfunction(number[4])==1)
        {
            data = data | 1 << a ;       //读取数据io口状态,保存值
        }
        Selectionfunction(number[0]);   //时钟低电平
        delay_us(time_us);
    }
    if(select==3) //仅读取数据
        {
            return data;
        }
      else CS1237Writ(number,time_us,select); //需要读取或修改状态
}

上述为读取adc的值

/*
   向寄存器写入或读取数据
   select为1时向寄存器写入数据  并且要吧写入的数据更改
   select为2时读取寄存器数据
*/
void CS1237Writ(u8 * number,u32 time_us,u8 select)
{
    static u8 i;
    static u8 data;
  data = (number[0]&0x30)>>4;//判断哪个IO配置输入或输出
    for(i=0;i<4;i++)
    {
    Selectionfunction(number[1]);//时钟高电平
    delay_us(time_us);
    Selectionfunction(number[0]);//时钟低电平
    delay_us(time_us);
    }
    CS1239_T_IO(data);  //配置为输出
    Selectionfunction(number[1]);//时钟高电平
    delay_us(time_us);
    Selectionfunction(number[0]);//时钟低电平
    delay_us(time_us);

    if(select==1)
    {
        CS1237WritByte(number,0x65,time_us);//发送写数据
    }
    else if(select==2)
    {
        CS1237WritByte(number,0x56,time_us);//发送读取数据
    }

    Selectionfunction(number[1]);//时钟高电平
    delay_us(time_us);
        if(select==1)
    {
        CS1239_T_IO(data);  //配置为输出
    }
    else if(select==2)
    {
        CS1239_R_IO(data);  //配置为输入
    }
    Selectionfunction(number[0]);//时钟低电平
    delay_us(time_us);
    
    GPIO_ResetBits(GPIOC, GPIO_Pin_6);
    
    if(select==1)
    {
        CS1237WritByte(number,CS_TX_DATA,time_us);//写入数据
    }
    else if(select==2)
    {
        CS1237RritByte(number,time_us);//  读取数据
    }


    Selectionfunction(number[1]);//时钟高电平
    delay_us(time_us);
    Selectionfunction(number[0]);//时钟低电平
    delay_us(time_us);
}

  

/*0x65写寄存器 0x56读寄存器*/
void CS1237WritByte(u8 * number,u8 typed,u32 time_us)
{
    u8 i=8,tmp,q;
    //发送8位数据
    
    if((typed!=0x65)&&(typed!=0x56))
        {
                    for(i=0;i<8;i++)
            {
                Selectionfunction(number[1]);//时钟高电平
                tmp    = (typed << i) & 0x80;  //高位在前

                if(tmp == 0)
                {
                    Selectionfunction(number[2]);//
                    delay_us(time_us);    //0        
                }
                else
                {
                
                    Selectionfunction(number[3]);//
                    delay_us(time_us);    //1        
                }
             Selectionfunction(number[0]);//时钟低电平    
             delay_us(time_us);
            }
       return ;            
        }
        for(i=0;i<7;i++)
        {
            Selectionfunction(number[1]);//时钟高电平
            tmp    = (typed << i) & 0x40;  //高位在前

            if(tmp == 0)
            {
                Selectionfunction(number[2]);//时钟高电平
                delay_us(time_us);    //0        
            }
            else
            {
                Selectionfunction(number[3]);//时钟高电平
                delay_us(time_us);    //1        
            }
         Selectionfunction(number[0]);//时钟低电平    
         delay_us(time_us);
        }    
}
/*0x65写寄存器   0x56读寄存器*/
u8 CS1237RritByte(u8 * number,u32 time_us)
{
    static u8 i=8,a;
    static u8 data;
    data=0;
        for(i=0;i<8;i++)
    {
        a=8-i-1;

        Selectionfunction(number[1]);//时钟高电平
        delay_us(time_us);
        
        if(Selectionfunction(number[4])==1)
        {
            data = data | 1 << a ;
        }
            Selectionfunction(number[0]);//时钟低电平
          delay_us(time_us);
    }
     Selectionfunction(number[0]);//时钟低电平    
   delay_us(time_us);
    printf("读取到cs1237的值为: %d
",data);
}

上面就是CS1237的读取过程了下面来看如何读取温度

温度测量用的是热敏电阻,需要求电阻的阻值也就是图中R6的值

R5的值是固定的30k

用两个cs1237分别求出两个电阻之间的电压  用30k的电压除以30k的电阻算出电流  然后用被测的电压除以这个电流值得出被测的电阻值来,然后查表法查出对应的温度


资源源网络,侵删