|  | 
沙发
 
 
 楼主|
发表于 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);
 }
 }
 
 | 
 |