采用STM32F101與外部AD CS5550。
本文引用地址:
http://m.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(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;
}
評論