ADX122驱动

ADX122驱动-凭空捏造

之前的章节里面我们写了adx112的驱动,adx122的驱动咱们还没写过,adx122是adx112的升级版本,升级成了20bit,并且内部自带恒流源,对于ptc/ntc测温会有比较好的帮助,省去了外围电路的偏置,adx122的第一页如下⬇️

大概是能看的出来兼容adx112的,采用的是spi的接口,在这个章节我们主要讲是如何编写驱动程序,所以先跳过一些重要信息。

既然采用spi接口我们就看看是哪种SPI,三线或者四线,上升沿写数据还是下降沿写数据,从手册的firgure2看是下降沿写数据,下降沿读数据,见下图⬇️

在数据手册的描述中找到了,是下降沿读数据,和下降沿写数据的。如⬇️

看下寄存器配置顺序,如下

先大致整个引脚定义,咱们先开始写下spi时序,大概测试打印正常,

Spi 读写大致完成,代码如下

#include <stdio.h>
/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs h\r\n")
#define cs_l printf("cs l\r\n")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk l\r\n")
#define hal_delay(x) printf("delay_%dms \r\n",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;
}

效果则如下所示

/Users/xutong/CLionProjects/untitled/cmake-build-debug/untitled

sclk h mosi l cs h

delay_1ms

cs l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi l sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

sclk h mosi h sclk l

aaaa0000

Process finished with exit code 0

符合我们的预期,但是adx122需要80个时钟,这边还是不够的,这里只有32个时钟,打印的数据带入excel 显而易见这里得出的结论就是55aaffff就是我们写的值,回读的aaaa0000也是我们写入的值,所以在这一步是没有问题的,继续向下⬇️

80个时钟要补全的东西有很多,若是要回读的话。我们就不能直接用int32-t了。

So 我们要用指针,定义一个数组,将读回来的数据传入数组,在返回整个数组,使用指针去接收。

#include <stdio.h>
/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs h\r\n")
#define cs_l printf("cs l\r\n")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk l\r\n")
#define hal_delay(x) printf("delay_%dms \r\n",x)
//declare function
int32_t* SPI_Write_Read(int32_t Data);

int main() {
int32_t *rdatas;
rdatas=SPI_Write_Read(0x55aaffff);
printf("%x\r\n",*rdatas);
printf("%x\r\n",*(rdatas+1));
printf("%x\r\n",*(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 <stdio.h>
/* define pin*/
#define mosi_h printf(" mosi h ")
#define mosi_l printf(" mosi l ")
#define cs_h printf("cs h\r\n")
#define cs_l printf("cs l\r\n")
#define sclk_h printf(" sclk h ")
#define sclk_l printf("sclk l\r\n")
#define hal_delay(x) printf("delay_%dms \r\n",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("%x\r\n",*rdatas);
printf("%x\r\n",*(rdatas+1));
printf("%x\r\n",*(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个沿

今天就先聊到这了,👋

posted @ 2023-02-08 21:58  xuyuntong  阅读(209)  评论(0编辑  收藏  举报