新聞中心

CS5550讀寫(xiě)程序

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

采用STM32F101與外部AD CS5550。

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

剛剛接觸這個(gè)CS5550,感覺(jué)時(shí)序有點(diǎn)怪異。尤其是讀的時(shí)候,在后3個(gè)指節(jié),還要寫(xiě)SYNCO.

剛開(kāi)始對(duì)這個(gè)非常不理解。后來(lái)參考了網(wǎng)上的一個(gè)程序。貌似網(wǎng)上就只有一個(gè)程序。于是有一點(diǎn)理解。就是說(shuō),單片機(jī)在讀CS5550的數(shù)據(jù)時(shí)(也就是讀MISO)還要往CS5550(MOSI)寫(xiě)數(shù)據(jù)。

CS5550讀寫(xiě)大致是這樣的。

讀寫(xiě)都要32個(gè)周期。

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

但是讀的時(shí)候在后24個(gè)周期的時(shí)候要寫(xiě)3次SYNCO(11111110).這個(gè)是難點(diǎn),容易被忽略。

剛開(kāi)始我也琢磨了很久。

后來(lái)終于柳岸花明。

然后就是周期的選擇,我是先低后高??吹骄W(wǎng)上很多程序都是先高后低。網(wǎng)上的程序我沒(méi)有成功過(guò)??赡茏约簺](méi)設(shè)置好。

把自己的代碼分享下,可能還有錯(cuò)誤。大家可以指點(diǎn)下。

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

//延時(shí)都是精確延時(shí),時(shí)間可以短一點(diǎn)沒(méi)問(wèn)題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ù)手冊(cè)上說(shuō)每次寫(xiě)的時(shí)候要等24個(gè)周期。自己試驗(yàn)后不需要等。
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;
}//寫(xiě)命令字

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

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;
}//寫(xiě)命令字
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;
}//寫(xiě)數(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;

}




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉