新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CS5550讀寫程序

        CS5550讀寫程序

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

        采用STM32F101與外部AD CS5550

        本文引用地址:http://www.104case.com/article/201611/321484.htm

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

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

        CS5550讀寫大致是這樣的。

        讀寫都要32個周期。

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

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

        剛開始我也琢磨了很久。

        后來終于柳岸花明。

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

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

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

        //延時都是精確延時,時間可以短一點沒問題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);
        //數據手冊上說每次寫的時候要等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;
        }//寫數據

        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;

        }




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 德保县| 西昌市| 沂水县| 东光县| 璧山县| 澎湖县| 宝清县| 新宁县| 繁昌县| 赫章县| 台南县| 海城市| 牡丹江市| 迁西县| 井陉县| 白城市| 海林市| 无为县| 玉田县| 葵青区| 惠东县| 嫩江县| 抚顺县| 大姚县| 蒙城县| 万荣县| 泸定县| 屯昌县| 南安市| 图木舒克市| 安乡县| 察哈| 井冈山市| 永靖县| 新绛县| 竹山县| 旺苍县| 灵武市| 兴和县| 兴隆县| 东光县|