新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 利用DM6437的McBSP配置SPI與ARM_S2440通信

        利用DM6437的McBSP配置SPI與ARM_S2440通信

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        McBSP是多通道緩沖串行口,DM6437提供了McBSP0&McBSP1兩個(gè)串行口,每個(gè)串行口有7個(gè)管腳,可以支持多通道串行數(shù)據(jù)通信。
        MCBSP的內(nèi)部框圖


        這兩個(gè)端口也支持時(shí)鐘停止模式,內(nèi)部FSR與FSX、CLKX與CLKR連接在一起,這時(shí)候DX為MOSI,,DR為MISO,CLKX為SCK和FSX為nSS。
        配置SPI口要注意的地方:通信模式選擇要一致;SPI提供了四種通信模式:SPI0、SPI1、SPI2、SPI3。
        McBSP通過(guò)配置CLKSTP與CLKXP來(lái)設(shè)置這四種模式:

        一般而言SPI0模式采用的多一些。
        SPI初始化步驟:

        在這之前還有兩個(gè)操作必須完成,DM6437的管腳復(fù)用設(shè)置為McBSP模式、McBSP的IO上電。(可以直接寫(xiě)相關(guān)寄存器、或者調(diào)用CSL函數(shù)),管腳復(fù)用只是設(shè)置DSP芯片管腳的引出方式,McBSP會(huì)有一個(gè)特殊情況,需要檢測(cè)第一個(gè)幀同步信號(hào);這個(gè)時(shí)候就可以復(fù)用FSX腳為GPIO腳,用GPIO來(lái)檢測(cè)信號(hào)的變化,因此我們有理由相信無(wú)論用戶采用配置出來(lái)是什么形態(tài),內(nèi)部這些腳其實(shí)是連在一起的。另外還申明一個(gè)誤區(qū):管腳復(fù)用和接口寄存器配置并沒(méi)有關(guān)系,用戶可以隨時(shí)配置McBSP接口的相關(guān)寄存器,而不需要指定這些腳已經(jīng)映射為McBSP管腳;當(dāng)然還是得滿足IO上拉的條件。

        DM6437 SPI Master Config

        DM6437 SPI Slaver Config

        編寫(xiě)程序可以根據(jù)CSL庫(kù)提供的函數(shù),可能看到TI針對(duì)DM6437不再提供CSL驅(qū)動(dòng)了,而是提供PSP驅(qū)動(dòng);但是這話不絕對(duì),TI還是有DM6437可用的CSL庫(kù)函數(shù)可以用,但是對(duì)我而言采用的是CSL提供的定義,自己編寫(xiě)函數(shù);因?yàn)槲艺业搅薈SL支持的寄存器數(shù)據(jù)結(jié)構(gòu),但是沒(méi)有找到相應(yīng)的CSL函數(shù)說(shuō)明,沒(méi)有看到函數(shù)原型。
        配置SPI口其實(shí)是很簡(jiǎn)單的,雖然我花費(fèi)了太多的時(shí)間,這個(gè)最后我會(huì)說(shuō)明,自己配置寄存器,可以很簡(jiǎn)單的直接給寄存器賦值,只要計(jì)算好該寄存器最后的值是什么直接賦值就可以了,但是需要注意復(fù)位腳設(shè)置什么的。。。該延時(shí)的要延時(shí)。這種寄存器配置一般而言沒(méi)有什么先后順序,沒(méi)有什么要求;有要求的文檔會(huì)有標(biāo)注。如果不是一次性設(shè)定寄存器的值,那么在設(shè)置寄存器的時(shí)候一定要很小心取與取或的時(shí)候不要覆蓋了前面的設(shè)置;這個(gè)因?yàn)槲业谝淮问且晃灰晃辉O(shè)置的,沒(méi)有注意;到得到的和自己想要的完成是兩回事。推薦一次性設(shè)置,當(dāng)然可讀性不就會(huì)這么好,可讀性可以在程序跑通了再追求。

        PSP_103什么版本的,如果自己電腦上面正好有這個(gè)驅(qū)動(dòng),那么直接調(diào)用,那就可以很簡(jiǎn)單了,和填空差不多了。LLC提供了底層驅(qū)動(dòng)的,這個(gè)部分和自己配置寄存器一樣的道理,DDC為驅(qū)動(dòng)核心層,提供了OS與底層的交互,也就是我們常說(shuō)的PSP驅(qū)動(dòng)了;BIOS是上層系統(tǒng)層調(diào)用了。如果對(duì)PSP熟悉,那么可以自己決定程序?qū)懺谀囊粚樱@個(gè)就是DM6437與DM642最大的不同。一般而言,我喜歡直接操作底層,從DM642養(yǎng)成的習(xí)慣。

        另外說(shuō)一下SPI數(shù)據(jù)通信的能力:
        如果主設(shè)備采用內(nèi)部時(shí)鐘,則SPI內(nèi)部時(shí)鐘為CPU時(shí)鐘/6,因?yàn)橹髟O(shè)備和從設(shè)備要保持同步,卻又采用各自的時(shí)鐘,所以必須保證從設(shè)備擁有同步能力,從設(shè)備的時(shí)鐘必須大于主設(shè)備時(shí)鐘8倍,從設(shè)備通常默認(rèn)設(shè)置到最大時(shí)鐘能力、即CLKDVG=1。
        另外數(shù)據(jù)的傳輸方式也會(huì)對(duì)數(shù)據(jù)通信能力有很大引向,McBSP提供了三種方式:CPU查詢模式、CPU中斷模式、EDMA3模式。采用EDMA3模式可以獲得最大的數(shù)據(jù)通信能力,當(dāng)然驅(qū)動(dòng)編寫(xiě)就復(fù)雜一些,如果采用PSP倒也罷了。

        最后說(shuō)一下在調(diào)試中遇到的問(wèn)題:
        1) 配置寄存器,一位一位配置,得到很意外的結(jié)果,最后一步一步跟蹤才找到原因。
        2) 根據(jù)文檔配置SPI口,但是就是不能正常通信。后來(lái)查找SPI協(xié)議,了解了SPI口相關(guān)知識(shí),才知道CLKXP并不能隨意配置
        3) 配置好SPI口,左看右看程序沒(méi)有問(wèn)題,但是就是不能正常通信,逐個(gè)檢測(cè)管腳狀態(tài),發(fā)現(xiàn)DR腳,沒(méi)有連接時(shí),都有波形輸出,倒是數(shù)據(jù)采樣不對(duì),換另一個(gè)端口,終于正常通信了。

        void SPI_Slave_Init ( unsigned long Bits )
        {
        unsigned long i;

        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,RESET); //frame sync reset
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,DISABLE); //transmitter reset
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,DISABLE); //receiver reset
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR reset

        //serial port control register SPCR
        mcbsp0Regs->SPCR = CSL_FMKT(MCBSP_SPCR_CLKSTP,DELAY); //In SPI mode, data sampled on rising edge with delay

        //pin control register
        mcbsp0Regs->PCR = CSL_FMKT(MCBSP_PCR_FSXM,EXTERNAL) //external frame sync
        | CSL_FMKT(MCBSP_PCR_CLKXM,INPUT) //trans clock mode
        | CSL_FMKT(MCBSP_PCR_FSXP,ACTIVELOW); //active low

        //sample rate generator SRGR
        mcbsp0Regs->SRGR = CSL_FMKT(MCBSP_SRGR_CLKSM,INTERNAL) //internal clock
        | CSL_FMK(MCBSP_SRGR_CLKGDV,1); //clock divider value

        switch ( Bits )
        {
        case SPI_8BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,8BIT); //receive word 8bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,8BIT); //trans word 8bit
        break;
        case SPI_12BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,12BIT); //receive word 12bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,12BIT); //trans word 12bit
        break;
        case SPI_16BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,16BIT); //receive word 16bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,16BIT); //trans word 16bit
        break;
        case SPI_20BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,20BIT); //receive word 20bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,20BIT); //trans word 20bit
        break;
        case SPI_24BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,24BIT); //receive word 24bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,24BIT); //trans word 24bit
        break;
        case SPI_32BIT:
        // receive control register
        mcbsp0Regs->RCR = CSL_FMKT(MCBSP_RCR_RWDLEN1,32BIT); //receive word 32bit
        //transmit control register
        mcbsp0Regs->XCR = CSL_FMKT(MCBSP_XCR_XWDLEN1,32BIT); //trans word 32bit
        break;
        default:;
        }

        //start the mcbsp running
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_GRST,CLKG); //SRGR out of reset
        for ( i = 0; i < 200; i++ ) { i++; }
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_RRST,ENABLE); //receiver enable
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_XRST,ENABLE); //transmitter enable
        for ( i = 0; i < 200; i++ ) { i++; }
        CSL_FINST(mcbsp0Regs->SPCR,MCBSP_SPCR_FRST,FSG); //enable frame sync
        }


        關(guān)鍵詞: DM6437McBSPSPIARMS2440通

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 佛冈县| 古田县| 盐城市| 阜新市| 临清市| 怀宁县| 高碑店市| 南宁市| 泽州县| 贵溪市| 柳州市| 重庆市| 柯坪县| 磴口县| 鹤壁市| 淮北市| 依安县| 舞阳县| 濮阳市| 喜德县| 邓州市| 海盐县| 化隆| 牟定县| 渝北区| 余姚市| 盈江县| 洪雅县| 三明市| 晴隆县| 上栗县| 楚雄市| 陵川县| 湘阴县| 荃湾区| 化德县| 平舆县| 西平县| 喜德县| 纳雍县| 若羌县|