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