前言
上面一个文章配置了普通的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文件
3.修改 kernel/drivers/misc 下 Makefile 和 Kconfig 文件(和上篇文章普通IO口配置一样)
4. 修改 kernel/arch/arm/configs 下的 msm8909-1gb_defconfig 文件(和上篇文章普通IO口配置一样)
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