zoukankan      html  css  js  c++  java
  • 创龙OMAPL138的SPI FLASH读写

    1. 目前最大的疑问是OMAPL138和DSP6748的DSP部分是完全一样的吗(虽然知道芯片完全是引脚兼容的)?因此现在使用OMAPL138的DSP内核去读写一下外部的SPI FLASH芯片,先看下原理图,可惜创龙核心板的原理图不开源,所以我肯定不买他们家的板子

    2. 尤其是startware这个软件库,究竟是用在ARM还是DSP的怎么区分?看资料ARM似乎可以唤醒DSP核?

    3. 心血来潮,测试一下,同一个工程是不是可以同时用在ARM和DSP内核上,只是用不用的GEL文件。经过测试发现,如果建立的工程,选的器件是DSP6748,那么生成的.out文件可以用于DSP核,如果选择的是ARM-OMAPL138那么生成的.out用于ARM核,原来是建立工程的时候选择是ARM核还是DSP核

    4. 言归正传,本来是搞SPI FLASH的,话题跑远了

    void SPIInterruptInit(void)
    {
        // 注册中断服务函数
        IntRegister(C674X_MASK_INT4, SPIIsr);
    
        // 映射中断事件
        IntEventMap(C674X_MASK_INT4, SYS_INT_SPI1_INT);
    
        // 使能可屏蔽中断
        IntEnable(C674X_MASK_INT4);
    }
    
    /****************************************************************************/
    /*                                                                          */
    /*              SPI 初始化                                                     */
    /*                                                                          */
    /****************************************************************************/
    void SPIInit(void)
    {
        unsigned char cs  = 0x01;
        unsigned char dcs = 0x01;
        unsigned int  val = SIMO_SOMI_CLK_CS;
    
        SPIReset(SOC_SPI_1_REGS);
    
        SPIOutOfReset(SOC_SPI_1_REGS);
    
        SPIModeConfigure(SOC_SPI_1_REGS, SPI_MASTER_MODE);
    
        SPIClkConfigure(SOC_SPI_1_REGS, 228000000, 20000000, SPI_DATA_FORMAT0);
    
        SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val);
    
        SPIDefaultCSSet(SOC_SPI_1_REGS, dcs);
    
        // 配置 SPI 数据格式
        SPIDataFormatConfig(SPI_DATA_FORMAT0);
    
        // 配置 SPI 数据格式及片选信号
        SPIDat1Config(SOC_SPI_1_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), cs);
    
        // 映射中断到 INT1
        SPIIntLevelSet(SOC_SPI_1_REGS, SPI_RECV_INTLVL | SPI_TRANSMIT_INTLVL);
    
        // 使能 SPI
        SPIEnable(SOC_SPI_1_REGS);
    }
    /****************************************************************************/
    /*                                                                          */
    /*              配置 SPI 数据格式                                           */
    /*                                                                          */
    /****************************************************************************/
    void SPIDataFormatConfig(unsigned int dataFormat)
    {
        // 配置 SPI 时钟
        SPIConfigClkFormat(SOC_SPI_1_REGS,
                            (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE),
                             dataFormat);
    
        // 配置 SPI 发送时 MSB 优先
        SPIShiftMsbFirst(SOC_SPI_1_REGS, dataFormat);
    
        // 设置字符长度
        SPICharLengthSet(SOC_SPI_1_REGS, CHAR_LENGTH, dataFormat);
    }
    
    /****************************************************************************/
    /*                                                                          */
    /*              SPI 传输                                                    */
    /*                                                                          */
    /****************************************************************************/
    void SpiTransfer(void)
    {
        p_tx = &tx_data[0];
        p_rx = &rx_data[0];
        SPIIntEnable(SOC_SPI_1_REGS, (SPI_RECV_INT | SPI_TRANSMIT_INT));
        while(flag);
        flag = 1;
    
        SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1);
    }
    
    /****************************************************************************/
    /*                                                                          */
    /*              SPI 中断服务函数                                            */
    /*                                                                          */
    /****************************************************************************/
    void SPIIsr(void)
    {
        unsigned int intCode = 0;
        IntEventClear(SYS_INT_SPI1_INT);
        intCode = SPIInterruptVectorGet(SOC_SPI_1_REGS);
    
        while (intCode)
        {
            if(intCode == SPI_TX_BUF_EMPTY)
            {
                tx_len--;
                SPITransmitData1(SOC_SPI_1_REGS, *p_tx);
                p_tx++;
                if (!tx_len)
                {
                    SPIIntDisable(SOC_SPI_1_REGS, SPI_TRANSMIT_INT);
                }
            }
    
            if(intCode == SPI_RECV_FULL)
            {
                rx_len--;
                *p_rx = (char)SPIDataReceive(SOC_SPI_1_REGS);
                p_rx++;
                if (!rx_len)
                {
                    flag = 0;
                    SPIIntDisable(SOC_SPI_1_REGS, SPI_RECV_INT);
                }
            }
    
            intCode = SPIInterruptVectorGet(SOC_SPI_1_REGS);
        }
    }
  • 相关阅读:
    627. whose 和 who's
    628. why 和why not
    629 will: 各种用法tyg
    enChapter 3 Underlying Technologiesp
    使用VIEWER.JS进行简单的图片预览
    outlook2010设置失败后重新设置
    新增和编辑clob字段
    金钱大写
    pivot 与 unpivot 函数是SQL05新提供的2个函数
    从函数到委托
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/9637594.html
Copyright © 2011-2022 走看看