新聞中心

CS5550讀寫程序

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
最近一直在寫采集板的程序。

采用STM32F101與外部AD CS5550

本文引用地址:http://butianyuan.cn/article/201611/321484.htm

剛剛接觸這個CS5550,感覺時序有點怪異。尤其是讀的時候,在后3個指節(jié),還要寫SYNCO.

剛開始對這個非常不理解。后來參考了網(wǎng)上的一個程序。貌似網(wǎng)上就只有一個程序。于是有一點理解。就是說,單片機在讀CS5550的數(shù)據(jù)時(也就是讀MISO)還要往CS5550(MOSI)寫數(shù)據(jù)。

CS5550讀寫大致是這樣的。

讀寫都要32個周期。

前8個周期讀寫都是相同的,就是都要先寫地址,然后讀/寫 地址的內(nèi)容。

但是讀的時候在后24個周期的時候要寫3次SYNCO(11111110).這個是難點,容易被忽略。

剛開始我也琢磨了很久。

后來終于柳岸花明。

然后就是周期的選擇,我是先低后高。看到網(wǎng)上很多程序都是先高后低。網(wǎng)上的程序我沒有成功過。可能自己沒設(shè)置好。

把自己的代碼分享下,可能還有錯誤。大家可以指點下。

總之寫程序要有耐心,可以模仿別人,但是千萬復(fù)制。往往復(fù)制的都會是有問題的。

//延時都是精確延時,時間可以短一點沒問題Delay_us(10)都行;

u32 Read_CS5550(u8 Read_Addr)
{
u8 Num;
u32 Read_Temp,Read_Data=0;
CS5550_CS_1;
Delay_us(50);
CS5550_CS_0;
Delay_us(100);
//數(shù)據(jù)手冊上說每次寫的時候要等24個周期。自己試驗后不需要等。
for(Num=1;Num<=8;Num++)
{
if(Read_Addr&0x80)
MOSI_1;
else
MOSI_0;
SCK_0;
Delay_us(1);
SCK_1;
Delay_us(1);
Read_Addr=Read_Addr<<1;
}//寫命令字

MOSI_1;
for(Num=1;Num<=24;Num++)
{
SCK_0;
Delay_us(20);
if(Num==7||Num==15||Num==23)//這里是難點,自己琢磨下。
MOSI_0;
if(Num==8||Num==16||Num==24)//這里是難點,自己琢磨下。

MOSI_1;
Read_Data=Read_Data<<1;
Read_Temp=MISO;
if(Read_Temp)
Read_Data=Read_Data+1;
Delay_us(200);
SCK_1;
Delay_us(200);

}
MOSI_1;
CS5550_CS_1;
Delay_us(200);
return Read_Data;

}
//READ 修改。。

void Write_CS5550(u8 Write_Addr,u32 Write_Data)
{
u8 num;
CS5550_CS_1;
Delay_us(50);

CS5550_CS_0;
Delay_us(50);


MOSI_1;
Delay_us(200);
for(num=1;num<=8;num++)
{
if(Write_Addr&0x80)
MOSI_1;
else
MOSI_0;
SCK_0;
Delay_us(200);
SCK_1;
Delay_us(200);

Write_Addr=Write_Addr<<1;
}//寫命令字
for(num=0;num<24;num++)
{
if(Write_Data&0x800000)
MOSI_1;
else
MOSI_0;
SCK_0;
Delay_us(200);
SCK_1;
Delay_us(200);
Write_Data=Write_Data<<1;
}//寫數(shù)據(jù)

MOSI_1;
SCK_0;
Delay_us(100);
CS5550_CS_1;

}

void Write_Command(u8 Command_Data)
{
u8 NUM;
CS5550_CS_1;
Delay_us(100);
CS5550_CS_0;
Delay_us(200);
for(NUM=1;NUM<=24;NUM++)
{
SCK_0;
Delay_us(200);
SCK_1;
Delay_us(200);

}

for(NUM=1;NUM<=8;NUM++)
{
if(Command_Data&0x80)
MOSI_1;
else
MOSI_0;
SCK_0;
Delay_us(200);
SCK_1;
Delay_us(200);


Command_Data= Command_Data<<1;
}

for(NUM=1;NUM<=24;NUM++)
{
SCK_0;
Delay_us(200);
SCK_1;
Delay_us(200);

}
CS5550_CS_1;
SCK_1;
MOSI_1;

}




關(guān)鍵詞: CS5550讀寫程序STM32F101

評論


技術(shù)專區(qū)

關(guān)閉