之前的章节里面我们写了adx112的驱动,adx122的驱动咱们还没写过,adx122是adx112的升级版本,升级成了20bit,并且内部自带恒流源,对于ptc/ntc测温会有比较好的帮助,省去了外围电路的偏置,adx122的第一页如下
大概是能看的出来兼容adx112的,采用的是spi的接口,在这个章节我们主要讲是如何编写驱动程序,所以先跳过一些重要信息。
既然采用spi接口我们就看看是哪种SPI,三线或者四线,上升沿写数据还是下降沿写数据,从手册的firgure2看是下降沿写数据,下降沿读数据,见下图
在数据手册的描述中找到了,是下降沿读数据,和下降沿写数据的。如
看下寄存器配置顺序,如下
先大致整个引脚定义,咱们先开始写下spi时序,大概测试打印正常,
#include
/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs hrn")
#define cs_l printf("cs lrn")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk lrn")
#define hal_delay(x) printf("delay_%dms rn",x)
//declare function
int32_t SPI_Write_Read(int32_t Data);
int main() {
int32_t rdata;
rdata=SPI_Write_Read(0x55aaffff);
printf("%x",rdata);
return 0;
}
int32_t SPI_Write_Read(int32_t Data)
{
int8_t i;
int32_t rdata=0;
//supporting role
int32_t misodata=0x0000aaaa;
int8_t miso=0;
//initial pin state
sclk_h;
mosi_l;
cs_h;
hal_delay(1);
//start transferring data
cs_l;
for (i = 0; i < 32; i++)
{
sclk_h;
if(Data&0x80000000)
{
mosi_h;
}
else
mosi_l;
// supporting role
miso=misodata&0x00000001;
misodata > >=1;
// Equivalent to rdata=rdata|miso
rdata|=miso;
rdata< <=1;
sclk_l;
Data< <=1;
}
return rdata;
}
效果则如下所示
符合我们的预期,但是adx122需要80个时钟,这边还是不够的,这里只有32个时钟,打印的数据带入excel 显而易见这里得出的结论就是55aaffff就是我们写的值,回读的aaaa0000也是我们写入的值,所以在这一步是没有问题的,继续向下
80个时钟要补全的东西有很多,若是要回读的话。我们就不能直接用int32-t了。
So 我们要用指针,定义一个数组,将读回来的数据传入数组,在返回整个数组,使用指针去接收。
#include/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs hrn")
#define cs_l printf("cs lrn")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk lrn")
#define hal_delay(x) printf("delay_%dms rn",x)
//declare function
int32_t* SPI_Write_Read(int32_t Data);
int main() {
int32_t *rdatas;
rdatas=SPI_Write_Read(0x55aaffff);
printf("%xrn",*rdatas);
printf("%xrn",*(rdatas+1));
printf("%xrn",*(rdatas+2));
return 0;
}
int32_t* SPI_Write_Read(int32_t Data)
{
int8_t i;
static int32_t rdata[11];
//supporting role
int32_t misodata=0x0000aaaa;
int8_t miso=0;
//initial pin state
sclk_h;
mosi_l;
cs_h;
hal_delay(1);
//start transferring data
cs_l;
for (i = 0; i < 32; i++)
{
sclk_h;
if(Data&0x80000000)
{
mosi_h;
}
else
mosi_l;
// supporting role
miso=misodata&0x00000001;
misodata > >=1;
// Equivalent to rdata=rdata|miso
rdata[0]|=miso;
rdata[0]< <=1;
sclk_l;
Data< <=1;
}
rdata[1]=0x1fffffff;
rdata[2]=0x2fffffff;
rdata[3]=0x3fffffff;
rdata[4]=0x4fffffff;
rdata[5]=0x5fffffff;
rdata[6]=0x6fffffff;
rdata[7]=0x7fffffff;
return rdata;
}
在这里看到和我们的设定是一样的
因为miso在这里我们是模拟的,是倒着来的看起来有点奇怪,实际用芯片没这样的问题。
看看模拟的效果。
SPI的大概驱动代码就整完了,自己再去对寄存器就好了。
#include/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs hrn")
#define cs_l printf("cs lrn")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk lrn")
#define hal_delay(x) printf("delay_%dms rn",x)
//declare function
u_int32_t* SPI_Write_Read(u_int32_t Data);
int main() {
u_int32_t *rdatas;
rdatas=SPI_Write_Read(0x55aaffff);
printf("%xrn",*rdatas);
printf("%xrn",*(rdatas+1));
printf("%xrn",*(rdatas+2));
return 0;
}
u_int32_t* SPI_Write_Read(u_int32_t Data)
{
int i;
static u_int32_t rdata[4]={0x00000000,0x00000000,
0x00000000,0x00000000};
//supporting role
u_int32_t temp;
u_int32_t misodata=0x10000001;
u_int32_t miso;
//initial pin state
sclk_h;
mosi_l;
cs_h;
hal_delay(1);
//start transferring data
cs_l;
temp=0;
for (i = 0; i < 32; i++)
{
sclk_h;
if(Data&0x80000000)
{
mosi_h;
}
else
{
mosi_l;
}
// supporting role
miso=misodata&0x00000001;
misodata > >=1;
// Equivalent to rdata=rdata|miso
rdata[0]< <=1;
rdata[0]|=miso;
sclk_l;
Data< <=1;
}
//rdata[1]
misodata=0x80000008;
//
for (i = 0; i < 32;i++)
{
sclk_h;
// supporting role
miso=misodata&0x00000001;
misodata > >=1;
// Equivalent to rdata=rdata|miso
rdata[1]< <=1;
rdata[1]|=miso;
sclk_l;
}
misodata=0x20000002;
//rdata[2]
for (i = 0; i < 16; i++)
{
sclk_h;
// supporting role
miso=misodata&0x00000001;
misodata > >=1;
// Equivalent to rdata=rdata|miso
rdata[2]< <=1;
rdata[2]|=miso;
sclk_l;
}
cs_h;
return rdata;
}
刚好80个沿
今天就先聊到这了.
评论
查看更多