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个沿
今天就先聊到这了,👋