这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Cypress » 使用SCB模块的通信接口时如何设置中断函数【已解决】

共18条 1/2 1 2 跳转至

使用SCB模块的通信接口时如何设置中断函数【已解决】

高工
2014-01-17 13:45:34     打赏

【此贴中包含了SPI转串的说明及工程文件】

我在使用PSoc4的SCB模块SPI时不知道如何配置接收中断,还有就是全局中断的设置,请各位大神指点一二,目前根据资料只是完成了SPI及串口等的发送功能,接收及中断都还没有完成。


答案:总体来说与51单片机差不多(全局中断加对应硬件中断都要使能),但更方便了,直接使用API即可,而且中断函数框架也是搭建好了,只需要添加应用代码即可,以下以分别写了全局中断及SPI中断的设置。


答案:

1. 全局中断的设置在CyLib.h文件中有宏定义如下:


#if defined(__ARMCC_VERSION)

    #define CyGlobalIntEnable           do                      \
                                        {                       \
                                            __enable_irq();     \
                                        } while ( 0 )

    #define CyGlobalIntDisable          do                      \
                                        {                       \
                                            __disable_irq();    \
                                        } while ( 0 )
#elif defined(__GNUC__)

    #define CyGlobalIntEnable           do                      \
                                        {                       \
                                            __asm("CPSIE   i"); \
                                        } while ( 0 )

    #define CyGlobalIntDisable          do                      \
                                        {                       \
                                            __asm("CPSID   i"); \
                                        } while ( 0 )

#endif  /* (__ARMCC_VERSION) */




所以可以在程序中以语句 CyGlobalIntDisable; 来完成全局中断的禁用。

使用语句CyGlobalIntEnable;来完成全局中断的使能。


答案2,以SPI通信的中断设置及服务函数为例:

先来SPI相关的配置截图:

SPI中断设置

先来主程序的代码:

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * 说明:该程序用于测试串口模块,使用PSoc 4
 * 下载器自带的串口通信引脚与PC进行通信
 * P12.6  -- PCTX   | 此为与PC机相连的串口
 * P12.7  -- PCRX
 * 本例程中实际PSoc 4的串口相关引脚如下:
 * P4.0   -- PSoc_RX
 * P4.1   -- PSOC_TX
 * 如果要将PSoc 4串口与PC相连,还需要使用跳线
 * 将PC串口线与PSoc串口线交叉相连
 *
 * 注意:并不是所有PSoc 4端口都支持串口,所以
 * 在选择串口引脚是要注意选择支持串口对应发送
 * 或接收功能的引脚
 * 2014-1-16 
 * Veiko
 * -----------------------------------------
 * SPI引脚连接(仅限本例)
 * MISO --  P4.1
 * MOSI --  P4.0
 * SCLK --  P4.2
 * SS   --  P4.3
 * 注意:本机是SPI从机模式
 * ========================================
*/
#include 

/*
#include "SPI_Slave_PVT.h"
#include "SPI_Slave_SPI_UART_PVT.h"
#include "UART_SPI_UART.h"
#include "SPI_Slave_SCB_IRQ.h"
#include "SPI_Slave.h"
*/


unsigned char SPI_Rec_Data = 0;
unsigned char CounterRec = 0;

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    UART_Start();
    
    SPI_Slave_Start();           /* 使能SPI模块工作 */
    SPI_Slave_SCB_IRQ_Start();   /* 使能SPI中断 */
    CyGlobalIntEnable;           /* 使能全局中断 */
    
    

    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
        UART_UartPutString("Hellow!/r/n");
        /*
        CounterRec = SPI_Slave_SpiUartGetRxBufferSize();
        if(CounterRec > 0)
        {
          SPI_Rec_Data =  SPI_Slave_mosi_s_ReadDataReg();
          UART_UartPutChar(SPI_Rec_Data);  
          SPI_Slave_SpiUartClearRxBuffer();
        }
        */
    }
}

/* [] END OF FILE */




再来SPI中断函数的代码,这个函数在SCB_SCB_IRQ.c 文件当中

/*******************************************************************************
* Function Name: SPI_Slave_SCB_IRQ_Interrupt
********************************************************************************
*
* Summary:
*   The default Interrupt Service Routine for SPI_Slave_SCB_IRQ.
*
*   Add custom code between the coments to keep the next version of this file
*   from over writting your code.
*
* Parameters:  
*   None
*
* Return:
*   None
*
*******************************************************************************/
CY_ISR(SPI_Slave_SCB_IRQ_Interrupt)
{
    unsigned char SPI_Rec_Data_spi = 0;
    unsigned char SPI_Rec_Counter = 0;
    /*  Place your Interrupt code here. */
    /* `#START SPI_Slave_SCB_IRQ_Interrupt` */
    
    if(SPI_Slave_SpiUartGetRxBufferSize() >=1)
    {
      SPI_Rec_Counter=SPI_Slave_SpiUartGetRxBufferSize();
      SPI_Rec_Data_spi =  (unsigned char)SPI_Slave_SpiUartReadRxData();
      UART_UartPutChar(SPI_Rec_Data_spi);  
    }
    SPI_Slave_SCB_IRQ_ClearPending();

    /* `#END` */
}




最后,传上我的代码,main.c中的代码注释可能有误,SCB的具体参数可直接双击SCB模块查看:

——回复可见内容——




关键词: 通信     接口     设置     中断    

高工
2014-01-17 14:23:58     打赏
2楼
陪楼主坐等高手,,,,

院士
2014-01-17 15:15:49     打赏
3楼
没有这个高级东西!

高工
2014-01-17 16:05:27     打赏
4楼
楼主变高手了,问题解决一小半了,可以使用默认的中断服务函数了。

高工
2014-01-17 16:06:44     打赏
5楼
挺不错的,可以做串口电平转换,可以做SPI转串口,可以做IIC转串口,并口转串口等一系列的东东!还可以用来测试SPI,IIC,串口等东西。

院士
2014-01-17 20:46:21     打赏
6楼
听上去好是诱人啊!!

高工
2014-01-17 20:52:26     打赏
7楼
主要是设置简单,不易出错,所以可以拿来测试使用的

专家
2014-01-17 22:43:38     打赏
8楼

菜鸟
2014-01-20 01:14:30     打赏
9楼
vc v

菜鸟
2015-04-15 15:46:03     打赏
10楼

我使用的是UART基本上程序跟你差不多,可是现在发现进中断后出不来了,中断标志位不用清除吗?



共18条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]