之前的章節(jié)里面我們寫了adx112的驅動,adx122的驅動咱們還沒寫過,adx122是adx112的升級版本,升級成了20bit,并且內部自帶恒流源,對于ptc/ntc測溫會有比較好的幫助,省去了外圍電路的偏置,adx122的第一頁如下
大概是能看的出來兼容adx112的,采用的是spi的接口,在這個章節(jié)我們主要講是如何編寫驅動程序,所以先跳過一些重要信息。
既然采用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也是我們寫入的值,所以在這一步是沒有問題的,繼續(xù)向下
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個沿
今天就先聊到這了.
評論
查看更多