创龙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);
    }
}

原文地址:https://www.cnblogs.com/429512065qhq/p/9637594.html

时间: 2024-09-29 23:55:05

创龙OMAPL138的SPI FLASH读写的相关文章

基于TI AM335x创龙开发板的快速体验

着手体验的是创龙TL335x-IDK,这个板子的特点如下: 基于 TI AM335x ARM Cortex-A8 CPU,主频可高达 1GHz,运算能力可高达 2000DMIPS,搭配DDR3,兼容 eMMC 和 NAND FLASH,超高性价比: 2 个 PRU 协处理器,支持 EtherCAT.PROFINET.EtherNet/IP.PROFIBUS.Ethernet POWERLINK.Sercos 等工业协议: 内部集成 SGX530 3D 图形加速器和 24bit LCD 触摸屏控制

广州创龙抢先推出AM437x开发板

1  开发板简介 TL437x-EasyEVM是广州创龙基于SOM-TL437x核心板研发的一款TI ARM Cortex-A9开发板,采用核心板+底板方式,尺寸为175mm x 110mm,核心板采用4*60pin B2B工业级连接器,稳定.可靠.便捷,可以帮助客户快速评估核心板性能. TL437x-EasyEVM开发板底板采用两层无铅沉金电路板设计,为了方便用户学习开发和参考使用,上面引出了各种常见的接口. 2  核心板简介 标配工业级核心板,基于TI AM437x ARM Cortex-A

创龙高性能AM437x Cortex-A9开发板

1  开发板简介 TL437x-EVM是广州创龙基于SOM-TL437x核心板研发的一款TI ARM Cortex-A9 AM437x开发板,采用核心板+底板方式,尺寸为180mm x 130mm,核心板采用4*60pin B2B工业级连接器,稳定.可靠.便捷,可以帮助客户快速评估核心板性能. TL437x-EVM开发板底板采用两层无铅沉金电路板设计,为了方便用户学习开发和参考使用,上面引出了各种常见的接口. 图 2 图 3 图4 图5 图6 图7 2  核心板简介 ? 标配工业级核心板,基于T

广州创龙TMS320C6655 TMS320C6657核心板

1 核心板简介 ? 处理器架构先进:基于TI KeyStone C66x多核定点/浮点DSP TMS320C665x,标配工业级核心板,单核TMS320C6655和双核TMS320C6657管脚Pin to Pin兼容,同等频率下具有四倍于C64x+器件的乘累加能力: ? 运算能力强:主频1.0/1.25GHz,单核可高达40GMACS和20GFLOPS,包含2个Viterbi协处理器和1个Turbo协处理解码器,每核心32KB L1P.32KB L1D.1MB L2,1MB多核共享内存,819

创龙DSP6748的DAC例程研究

1. 创龙DSP6748开发板驱动TL5724这个DAC,输出指定的电压值,此程序是使用 IO 口模拟 SPI 实现与 TL5724 模块的数据交互. 2. 首先是初始化PSC函数 void PSCInit(void) {// 使能 GPIO 模块 PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); } 2. DAC的读写函数 // 管脚复用配置 GPIO

基于TI AM335x创龙开发板U-Boot编译

分享一下基于广州创龙TL335x-IDK开发板的U-Boot编译.希望能帮助上你. 板子特点如下: ? 基于 TI AM335x ARM Cortex-A8 CPU,主频可高达 1GHz,运算能力可高达 2000DMIPS,搭配DDR3,兼容 eMMC 和 NAND FLASH,超高性价比: ? 2 个 PRU 协处理器,支持 EtherCAT.PROFINET.EtherNet/IP.PROFIBUS.Ethernet POWERLINK.Sercos 等工业协议: ? 内部集成 SGX530

nand flash,nor flash,spi flash,片上RAM,片外RAM

Flash有掉电数据保存的特点,RAM掉电则数据丢失,但是RAM的速度更高,擦写次数理论上没有限制,而Flash则不行. Nand Flash相比其余的几种flash优势在于可擦写次数多,擦写速度快,但是在使用以及使用过程中会出现坏块因此需要做特殊 处理才可以使用.其主要用于数据存储,大部分U盘都是Nand Flash. Nor Flash读写时序类似于SRAM,只是写的次数较少,速度也慢,由于其读时序类似于SRAM,读地址是线性结构,多用于程序代码的 存储. SPI Flash同Nand Fl

FPGA设计——SPI Flash启动之MC8051设计

1. 概述 本设计采用FPGA技术,在FPGA中实现8051单片机的软核,将外部SPI Flash中的代码数据加载到FPGA内部ram,然后复位MC8051,实现外部flash启动MC8051. 2. 系统框图 8051采用Oregano Systems公司开源的MC8051软核.SPI Flash采用W25Q16芯片存储8051的代码程序.系统框图如下: 3. MC8051简介 Oregano Systems的8051单片机采用VHDL语言开发,具有如下特点: 采用完全同步设计 指令集和标准

Arduino SPI + SPI Flash芯片W25Q80BV

W25Q80BV是台湾华邦电子(Winbond)生产的8M-bit串行flash芯片.主要特性有: 工作电压:2.5 ~ 3.6 V 功耗:读写(active)时4mA,低功耗(power-down)时<1μA 容量:8M-bit/1M-byte,包含4096个页(每页大小256字节) 接口:Standard/Dual/Quad SPI,支持时钟频率最高104MHz 支持以4/32/64k-bytes为单位进行Sector/Block擦除 一次写入最多256字节 软件/硬件写保护功能 大于10万