CH585 SPI0从机-单字节中断接收数据

 

/********************************** (C) COPYRIGHT *******************************
 * File Name          : Main.c
 * Author             : WCH
 * Version            : V1.0
 * Date               : 2020/08/06
 * Description        : SPI0演示 Master/Slave 模式数据收发
 *********************************************************************************
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * Attention: This software (modified or not) and binary are used for 
 * microcontroller manufactured by Nanjing Qinheng Microelectronics.
 *******************************************************************************/

#include "CH58x_common.h"

__attribute__((aligned(4))) uint8_t spiBuff[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6};
__attribute__((aligned(4))) uint8_t spiBuffrev[64] = {0};

uint8_t count=0;

void DebugInit(void)                                  // SPI0与例程惯用串口打印引脚冲突,所以此例程改用UART1_输出打印
{
    GPIOB_SetBits(GPIO_Pin_13);
    GPIOPinRemap(ENABLE, RB_PIN_UART1);
    GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
}

__HIGH_CODE
void Main_Process(void)
{
    if(count)
    {
        for(uint8_t i=0;i<count;i++)
        {
            PRINT("%02X ",spiBuffrev[i]);
        }
        PRINT("\n");
        count=0;
    }
}

void SPI_INIT(void)
{
    /* 设备模式 */
    PRINT("1.spi0 mul slave mode \n");
    GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);
    SPI0_SlaveInit();

    R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;//设置输入方向
    SPI0_ClearITFlag(RB_SPI_IE_BYTE_END);//单字节收发完成中断
    SPI0_ITCfg(ENABLE, RB_SPI_IE_BYTE_END);
    PFIC_EnableIRQ( SPI0_IRQn );
}


int main()
{
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);

    /* 配置串口调试 */
    DebugInit();
    PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
    SPI_INIT();
    DelayMs(100);

    while(1)
    {
        Main_Process();
    }
}

/*********************************************************************
 * @fn      SPI0_IRQHandler
 *
 * @brief   SPI0中断函数
 *
 * @return  none
 */
__INTERRUPT
__HIGH_CODE
void SPI0_IRQHandler(void)
{
    if(SPI0_GetITFlag(RB_SPI_IE_BYTE_END))//单字节收发完成中断
    {
        while(R8_SPI0_FIFO_COUNT)
        {
            spiBuffrev[count]=R8_SPI0_FIFO;
            count++;
        }
        SPI0_ClearITFlag(RB_SPI_IE_BYTE_END);
    }
}

 

posted @ 2025-09-03 09:55  oTvTo  阅读(21)  评论(0)    收藏  举报