在MSM8909 Android下配置CS1237驱动,读取PT100温度传感器

前言

上面一个文章配置了普通的GPIO口。然后根据在单片机的经验,尝试配置CS1237驱动。

CS1237是一款高精度、低功耗模数转换芯片,一路差分输入通道,内置温度传感器和高精度振荡器。通过 2线SPI接口 通信。

在单片机中是使用模拟IO口的方式实现SPI通信。在Android里也是一样。

目录

前言

实现

1.首先还是配置DTS设备树,修改kernel/arch/arm/boot/dts/qcom/msm8909-mtp.dtsi。

2.在 kernel/drivers/misc 下添加 cs1237.c文件

(1)IO口函数操作定义

(2)cs1237配置初始化,读取配置函数

(3)probe函数中添加

(4)读取CS1237数值

3.修改 kernel/drivers/misc 下 Makefile 和 Kconfig 文件(和上篇文章普通IO口配置一样)

4. 修改 kernel/arch/arm/configs 下的 msm8909-1gb_defconfig 文件(和上篇文章普通IO口配置一样)

5. 执行编译、烧录

6. 测试驱动

7.java层获取PT100温度数值

jni层调用cat命令获取cs1237读数

java层调用jni函数,将读数转成温度数值


PT100是一直热电阻温度传感器

实现

1.首先还是配置DTS设备树,修改kernel/arch/arm/boot/dts/qcom/msm8909-mtp.dtsi。

cs1237 {
            compatible = "cs1237";
            //这是一个enable的pin
            cs1237,gpio0 = <&msm_gpio 0 0>;
            //SDA pin
            cs1237,gpio68 = <&msm_gpio 68 0>;
            //SCL pin
			cs1237,gpio69 = <&msm_gpio 69 0>;
            label = "cs1237";
		};

2.在 kernel/drivers/misc 下添加 cs1237.c文件

(1)IO口函数操作定义

void CLK_H(void){gpio_set_value(CLK_PIN, GPIO_HIGH);}
void CLK_L(void){gpio_set_value(CLK_PIN, GPIO_LOW);}
void SDA_H(void){gpio_set_value(SDA_PIN, GPIO_HIGH);}
void SDA_L(void){gpio_set_value(SDA_PIN, GPIO_LOW);}
int SDA_Read(void){return gpio_get_value(SDA_PIN);}
void SDA_OUT(void){gpio_direction_output(SDA_PIN, 1);}
void SDA_IN(void){gpio_direction_input(SDA_PIN);}

(2)cs1237配置初始化,读取配置函数

unsigned char cs1237_init_config(void)
{
    int count_i = 0; //溢出计时器
    int i = 0;
    unsigned char dat = PGA_2 | SPEED_640 | REF_ON;

    SDA_OUT();//SDA_H();

	SDA_IN();
	CLK_L();

	while(SDA_Read() == 1) { //等待CS237准备好
        mdelay(5);
        count_i++;

        if(count_i > 300) {
            SDA_OUT();
            //SDA_H(); // OUT引脚拉高
            CLK_H(); // CLK引脚拉高
            return -1;//超时,则直接退出程序
        }
    }
    for(i = 0; i < 29; i++) { // 1 - 29
        CLK_H();udelay(1);CLK_L();udelay(1);
    }

    SDA_OUT();

	CLK_H();udelay(1);SDA_H();CLK_L();udelay(1);//30
	CLK_H();udelay(1);SDA_H();CLK_L();udelay(1);//31
    CLK_H();udelay(1);SDA_L();CLK_L();udelay(1);//32
    CLK_H();udelay(1);SDA_L();CLK_L();udelay(1);//33
    CLK_H();udelay(1);SDA_H();CLK_L();udelay(1);//34
    CLK_H();udelay(1);SDA_L();CLK_L();udelay(1);//35
    CLK_H();udelay(1);SDA_H();CLK_L();udelay(1);//36

    CLK_H();udelay(1);CLK_L();udelay(1);    //37  写入了0x65


    for(i = 0; i < 8; i++) { // 38 - 45个脉冲了,写8位数据
        CLK_H();
        udelay(1);
        if(dat & 0x80)
            SDA_H();
        else
            SDA_L();
        dat <<= 1;
        CLK_L();
        udelay(1);
    }
    SDA_H();
    CLK_H
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值