先说下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的电阻算出电流 然后用被测的电压除以这个电流值得出被测的电阻值来,然后查表法查出对应的温度
资源源网络,侵删