如何编写ADX122驱动程序?

接口/总线/驱动

1143人已加入

描述

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

HAL库

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

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

HAL库

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

HAL库

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

HAL库

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

HAL库

#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;
}

效果则如下所示

HAL库

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

HAL库

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

HAL库

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;
}

在这里看到和我们的设定是一样的

HAL库

因为miso在这里我们是模拟的,是倒着来的看起来有点奇怪,实际用芯片没这样的问题。

看看模拟的效果。

HAL库

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个沿

HAL库

今天就先聊到这了.

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分