|
沙发
楼主 |
发表于 2016-9-12 10:45:55
|
只看该作者
/****************************************************************************/
/* */
/* SPI 中断初始化 */
/* */
/****************************************************************************/
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);
}
}
|
|