找回密码
 立即注册
查看: 43|回复: 7

SPI通讯问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 10:27:28 | 显示全部楼层 |阅读模式

STC32G12K128 9.62实验箱程序 1

#include "config.h" //默认已包含stdio.h、intrins.h等头文件

//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>

//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
void F54(void);
//<<AICUBE_USER_GLOBAL_DEFINE_END>>

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
uint8_t spi;
//<<AICUBE_USER_MAIN_INITIAL_END>>

SYS_Init();

//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码 
P40 = 0;

//<<AICUBE_USER_MAIN_CODE_END>>

while (1)
{
    //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
    // 在此添加主函数中用户主循环代码  
    if(spi == 0X99)
    {
        F54();
        P6 = ~P6;
    }
    SPI_WriteByte(0X55);//发送
    spi = SPI_ReadByte();//接收
    printf_usb("spi = %02X",spi);
    delay_ms(500);
    //<<AICUBE_USER_MAIN_LOOP_END>>
}

}

void F54(void)
{
P54 = 0;
delay_ms(5);
P54 = 1;
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基

//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码  
//<<AICUBE_USER_PREINITIAL_CODE_END>>

PORT1_Init();                       //P1口初始化
PORT2_Init();                       //P2口初始化
PORT3_Init();                       //P3口初始化
PORT4_Init();                       //P4口初始化
PORT5_Init();                       //P5口初始化
PORT6_Init();                       //P6口初始化
CLK_Init();                         //时钟模块初始化
SPI_Init();                         //SPI初始化
delay_ms(1);
USBLIB_Init();                      //USB库初始化
delay_ms(1);

//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_INITIAL_CODE_END>>

EnableGlobalInt();                  //使能全局中断

}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6
} while (--us);
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;

do
{
    i = MAIN_Fosc / 6000;
    while (--i);
} while (--ms);

}

////////////////////////////////////////
// P1口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_Init(void)
{
SetP1nInitLevelHigh(PIN_ALL); //设置P1初始化电平
SetP1nQuasiMode(PIN_ALL); //设置P1为准双向口模式

DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
EnableP1nSchmitt(PIN_ALL);          //使能P1施密特触发
SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
SetP1nDrivingNormal(PIN_ALL);       //设置P1一般驱动能力
SetP1nDigitalInput(PIN_ALL);        //使能P1数字信号输入功能

//<<AICUBE_USER_PORT1_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT1_INITIAL_END>>

}

////////////////////////////////////////
// P2口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_Init(void)
{
SetP2nInitLevelHigh(PIN_ALL); //设置P2初始化电平
SetP2nQuasiMode(PIN_ALL); //设置P2为准双向口模式

DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
EnableP2nSchmitt(PIN_ALL);          //使能P2施密特触发
SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
SetP2nDigitalInput(PIN_ALL);        //使能P2数字信号输入功能

//<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT2_INITIAL_END>>

}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
SetP3nInitLevelHigh(PIN_ALL); //设置P3初始化电平
SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式

EnableP3nPullUp(PIN_5 | PIN_4);     //使能P3.5,P3.4内部上拉电阻
DisableP3nPullUp(PIN_7 | PIN_6 | PIN_3 | PIN_2 | PIN_1 | PIN_0); 
EnableP3nSchmitt(PIN_ALL);          //使能P3施密特触发
SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能

//<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT3_INITIAL_END>>

}

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nInitLevelHigh(PIN_ALL); //设置P4初始化电平
SetP4nQuasiMode(PIN_ALL); //设置P4为准双向口模式

DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL);          //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL);        //使能P4数字信号输入功能

//<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT4_INITIAL_END>>

}

////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
SetP5nInitLevelHigh(PIN_ALL); //设置P5初始化电平
SetP5nQuasiMode(PIN_ALL); //设置P5为准双向口模式

DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL);          //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL);        //使能P5数字信号输入功能

//<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT5_INITIAL_END>>

}

////////////////////////////////////////
// P6口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT6_Init(void)
{
SetP6nInitLevelHigh(PIN_ALL); //设置P6初始化电平
SetP6nQuasiMode(PIN_ALL); //设置P6为准双向口模式

DisableP6nPullUp(PIN_ALL);          //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL);          //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL);      //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL);       //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL);        //使能P6数字信号输入功能

//<<AICUBE_USER_PORT6_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT6_INITIAL_END>>

}

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
CLK_HSIOCK_Divider(1); //设置高速外设时钟预分频系数

CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

HIRC_24M();                         //选择内部预置的频率

CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择

CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数

CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源

//<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_CLOCK_INITIAL_END>>

}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令

//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_USBLIB_INITIAL_END>>

}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)
}

////////////////////////////////////////
// USB设备接收数据中断回调程序
// 入口参数: 无
// 函数返回: 无
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Callback(void)
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
// 在此处添加用户处理接收数据的代码
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
}

//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 10:28:52 | 显示全部楼层

STC32G12K128 9.62实验箱程序2

主机模式

#include "SPI.h"

//回环测试
uint8_t SPI_ReadWriteByte(uint8_t dat)
{
SPI_SendData(dat); // 发数据
while(!SPI_CheckFlag()); // 等待完成
SPI_ClearFlag();
return SPI_ReadData(); // 同时读到数据
}

////////////////////////////////////////
// SPI初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SPI_Init(void)
{
SPI_SwitchP2n(); //选择SPI数据口: SS(P2.2), MOSI(P2.3), MISO(P2.4), SCLK(P2.5)

SPI_MasterMode();                   //设置SPI为主机模式
SPI_IgnoreSS();                     //忽略SS脚
SPI_DataMSB();                      //设置SPI数据顺序为MSB (高位在前)
SPI_SetMode0();                     //设置SPI工作模式0 (CPOL=0, CPHA=0)
SPI_SetClockDivider4();             //设置SPI时钟分频

HSSPI_Disable();                    //关闭SPI高速模式

SPI_Enable();                       //使能SPI功能

//<<AICUBE_USER_SPI_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_SPI_INITIAL_END>>

}

////////////////////////////////////////
// SPI主机模式发送字节函数
// 入口参数: dat (待发送的字节数据)
// 函数返回: 无
////////////////////////////////////////
void SPI_WriteByte(uint8_t dat)
{
SPI_SendData(dat); //触发主机发送数据
while (!SPI_CheckFlag()); //等待发送完成
SPI_ClearFlag(); //清除中断标志
}

////////////////////////////////////////
// SPI主机模式读取字节函数
// 入口参数: 无
// 函数返回: 读取的字节数据
////////////////////////////////////////
uint8_t SPI_ReadByte(void)
{
SPI_SendData(0xff); //触发主机读取数据(主机发送时钟信号)
while (!SPI_CheckFlag()); //等待读取完成
SPI_ClearFlag(); //清除中断标志
return SPI_ReadData();
}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 10:29:51 | 显示全部楼层

从机 STC8H8K64U 9.62实验箱

#include "config.h" //默认已包含stdio.h、intrins.h等头文件

//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>

//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
uint8_t spi = 0;
uint8_t spi_f,spi_j;

//<<AICUBE_USER_GLOBAL_DEFINE_END>>

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码

//<<AICUBE_USER_MAIN_INITIAL_END>>

SYS_Init();

//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码  
spi_f = 0X99;
//<<AICUBE_USER_MAIN_CODE_END>>

while (1)
{
  
    USBLIB_OUT_Done();              //查询方式处理USB接收的数据

    //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
    // 在此添加主函数中用户主循环代码 
    SPDAT = spi_f;//需发送数据
    while(!(SPSTAT & 0X80));//等待主机发送指令
    SPSTAT &= ~0X80;//清标志
    spi_j = SPDAT;//接收数据
    if(spi_j == 0X55)
    {
        spi_j = 0X00;//翻转一次
        P6 = ~P6;
    }
  
    //<<AICUBE_USER_MAIN_LOOP_END>>
}

}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基

//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码  
//<<AICUBE_USER_PREINITIAL_CODE_END>>

PORT2_Init();                       //P2口初始化
PORT3_Init();                       //P3口初始化
PORT4_Init();                       //P4口初始化
PORT5_Init();                       //P5口初始化
PORT6_Init();                       //P6口初始化
CLK_Init();                         //时钟模块初始化
SPI_Init();                         //SPI初始化
delay_ms(1);
USBLIB_Init();                      //USB库初始化
delay_ms(1);

//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_INITIAL_CODE_END>>

EnableGlobalInt();                  //使能全局中断

}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(14); //(MAIN_Fosc + 500000) / 1000000 - 10
} while (--us);
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;

do
{
    i = MAIN_Fosc / 10000;
    while (--i);
} while (--ms);

}

////////////////////////////////////////
// P2口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT2_Init(void)
{
SetP2nInitLevelHigh(PIN_ALL); //设置P2初始化电平
SetP2nQuasiMode(PIN_ALL); //设置P2为准双向口模式

DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
EnableP2nSchmitt(PIN_ALL);          //使能P2施密特触发
SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
SetP2nDigitalInput(PIN_ALL);        //使能P2数字信号输入功能

//<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT2_INITIAL_END>>

}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
SetP3nInitLevelHigh(PIN_ALL); //设置P3初始化电平
SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式

EnableP3nPullUp(PIN_5 | PIN_4);     //使能P3.5,P3.4内部上拉电阻
DisableP3nPullUp(PIN_7 | PIN_6 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //关闭P3.7,P3.6,P3.3,P3.2,P3.1,P3.0内部上拉电阻
EnableP3nSchmitt(PIN_ALL);          //使能P3施密特触发
SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能

//<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT3_INITIAL_END>>

}

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nInitLevelHigh(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1); //设置P4.7,P4.6,P4.5,P4.4,P4.3,P4.2,P4.1初始化电平
SetP4nInitLevelLow(PIN_0); //设置P4.0初始化电平
SetP4nQuasiMode(PIN_ALL); //设置P4为准双向口模式

DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL);          //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL);        //使能P4数字信号输入功能

//<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT4_INITIAL_END>>

}

////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
SetP5nInitLevelHigh(PIN_ALL); //设置P5初始化电平
SetP5nQuasiMode(PIN_ALL); //设置P5为准双向口模式

DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL);          //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL);        //使能P5数字信号输入功能

//<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT5_INITIAL_END>>

}

////////////////////////////////////////
// P6口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT6_Init(void)
{
SetP6nInitLevelHigh(PIN_ALL); //设置P6初始化电平
SetP6nQuasiMode(PIN_ALL); //设置P6为准双向口模式

DisableP6nPullUp(PIN_ALL);          //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL);          //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL);      //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL);       //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL);        //使能P6数字信号输入功能

//<<AICUBE_USER_PORT6_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT6_INITIAL_END>>

}

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
CLK_SYSCLK_Divider(10); //切换主时钟前先将系统时钟降频

HIRC_24M();                         //选择内部预置的频率

CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择

CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数

//<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_CLOCK_INITIAL_END>>

}

////////////////////////////////////////
// SPI初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SPI_Init(void)
{
SPI_SwitchP2n(); //选择SPI数据口: SS(P2.2), MOSI(P2.3), MISO(P2.4), SCLK(P2.5)

SPI_SlaveMode();                    //设置SPI为从机模式
SPI_UnignoreSS();                   //从机模式设置CPHA为0时,SS脚脚一定不能忽略(必须SSIG=0)
SPI_DataMSB();                      //设置SPI数据顺序为MSB (高位在前)
SPI_SetMode0();                     //设置SPI工作模式0 (CPOL=0, CPHA=0)
SPI_SetClockDivider4();             //设置SPI时钟分频

SPI_Enable();                       //使能SPI功能

//<<AICUBE_USER_SPI_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_SPI_INITIAL_END>>

}

////////////////////////////////////////
// SPI主机模式发送字节函数
// 入口参数: dat (待发送的字节数据)
// 函数返回: 无
////////////////////////////////////////
void SPI_WriteByte(uint8_t dat)
{
SPI_SendData(dat); //触发主机发送数据
while (!SPI_CheckFlag()); //等待发送完成
SPI_ClearFlag(); //清除中断标志
}

////////////////////////////////////////
// SPI主机模式读取字节函数
// 入口参数: 无
// 函数返回: 读取的字节数据
////////////////////////////////////////
uint8_t SPI_ReadByte(void)
{
SPI_SendData(0xff); //触发主机读取数据(主机发送时钟信号)
while (!SPI_CheckFlag()); //等待读取完成
SPI_ClearFlag(); //清除中断标志
return SPI_ReadData();
}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令

//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_USBLIB_INITIAL_END>>

}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady) //查询是否有接收到USB主机发送数据
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
// 在此处添加用户处理接收数据的代码
if (UsbOutBuffer[0] == 1)
printf_usb("spi = %bX",spi);
else if (UsbOutBuffer[0] == 2)
printf_usb("China !\r\n");

    //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
    usb_OUT_done();                 //当前包的数据处理完成,通知USB主机可以发送下一包数据
}

}

//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 10:33:24 | 显示全部楼层
上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3和P2.4不交叉,无效),P2.5和P2.5相连
屏幕截图 2026-04-21 103045.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-4-21 10:56:51 | 显示全部楼层
圣灵*** 发表于 2026-4-21 10:33
上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3 ...

两个实验箱各自测试
先看看各自和SPI的模块通信测试如何
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-4-21 10:59:39 | 显示全部楼层
圣灵*** 发表于 2026-4-21 10:33
上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3 ...

有两种模式
主和从
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 11:47:43 | 显示全部楼层
狂热*** 发表于 2026-4-21 10:56
两个实验箱各自测试
先看看各自和SPI的模块通信测试如何

32G的主机测试没问题,8H的从机该这么测试?能回环吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:234
  • 最近打卡:2026-04-30 01:26:24
已绑定手机

22

主题

401

回帖

1816

积分

金牌会员

DIY玩家

积分
1816
发表于 2026-4-21 11:49:21 | 显示全部楼层
两种单片机支持

截图202604211148517398.jpg

注意回环测试可能有影响
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:31 , Processed in 0.124942 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表