圣灵主宰 发表于 2026-4-21 10:27:28

SPI通讯问题

<p>STC32G12K128   9.62实验箱程序 1</p>
<p>#include &quot;config.h&quot;                     //默认已包含stdio.h、intrins.h等头文件</p>
<p>//&lt;&lt;AICUBE_USER_INCLUDE_BEGIN&gt;&gt;<br />
// 在此添加用户头文件包含<br />
//&lt;&lt;AICUBE_USER_INCLUDE_END&gt;&gt;</p>
<p>//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_BEGIN&gt;&gt;<br />
// 在此添加用户全局变量定义、用户宏定义以及函数声明<br />
void F54(void);<br />
//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_END&gt;&gt;</p>
<p>////////////////////////////////////////<br />
// 项目主函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void main(void)<br />
{<br />
//&lt;&lt;AICUBE_USER_MAIN_INITIAL_BEGIN&gt;&gt;<br />
// 在此添加用户主函数初始化代码<br />
uint8_t spi;<br />
//&lt;&lt;AICUBE_USER_MAIN_INITIAL_END&gt;&gt;</p>
<pre><code>SYS_Init();

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

//&lt;&lt;AICUBE_USER_MAIN_CODE_END&gt;&gt;

while (1)
{
    //&lt;&lt;AICUBE_USER_MAIN_LOOP_BEGIN&gt;&gt;
    // 在此添加主函数中用户主循环代码
    if(spi == 0X99)
    {
      F54();
      P6 = ~P6;
    }
    SPI_WriteByte(0X55);//发送
    spi = SPI_ReadByte();//接收
    printf_usb(&quot;spi = %02X&quot;,spi);
    delay_ms(500);
    //&lt;&lt;AICUBE_USER_MAIN_LOOP_END&gt;&gt;
}
</code></pre>
<p>}</p>
<p>void F54(void)<br />
{<br />
P54 = 0;<br />
delay_ms(5);<br />
P54 = 1;<br />
}</p>
<p>////////////////////////////////////////<br />
// 系统初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SYS_Init(void)<br />
{<br />
EnableAccessXFR();                  //使能访问扩展XFR<br />
AccessCodeFastest();                //设置最快速度访问程序代码<br />
AccessIXramFastest();               //设置最快速度访问内部XDATA<br />
IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基</p>
<pre><code>//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户预初始化代码
//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_END&gt;&gt;

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);

//&lt;&lt;AICUBE_USER_INITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_INITIAL_CODE_END&gt;&gt;

EnableGlobalInt();                  //使能全局中断
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 微秒延时函数<br />
// 入口参数: us (设置延时的微秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_us(uint16_t us)<br />
{<br />
do<br />
{<br />
NOP(18);                        //(MAIN_Fosc + 500000) / 1000000 - 6<br />
} while (--us);<br />
}</p>
<p>////////////////////////////////////////<br />
// 毫秒延时函数<br />
// 入口参数: ms (设置延时的毫秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_ms(uint16_t ms)<br />
{<br />
uint16_t i;</p>
<pre><code>do
{
    i = MAIN_Fosc / 6000;
    while (--i);
} while (--ms);
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P1口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT1_Init(void)<br />
{<br />
SetP1nInitLevelHigh(PIN_ALL);       //设置P1初始化电平<br />
SetP1nQuasiMode(PIN_ALL);         //设置P1为准双向口模式</p>
<pre><code>DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
EnableP1nSchmitt(PIN_ALL);          //使能P1施密特触发
SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
SetP1nDrivingNormal(PIN_ALL);       //设置P1一般驱动能力
SetP1nDigitalInput(PIN_ALL);      //使能P1数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT1_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT1_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P2口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT2_Init(void)<br />
{<br />
SetP2nInitLevelHigh(PIN_ALL);       //设置P2初始化电平<br />
SetP2nQuasiMode(PIN_ALL);         //设置P2为准双向口模式</p>
<pre><code>DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
EnableP2nSchmitt(PIN_ALL);          //使能P2施密特触发
SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
SetP2nDigitalInput(PIN_ALL);      //使能P2数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT2_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT2_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P3口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT3_Init(void)<br />
{<br />
SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平<br />
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为准双向口模式<br />
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式</p>
<pre><code>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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT3_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT3_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P4口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT4_Init(void)<br />
{<br />
SetP4nInitLevelHigh(PIN_ALL);       //设置P4初始化电平<br />
SetP4nQuasiMode(PIN_ALL);         //设置P4为准双向口模式</p>
<pre><code>DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL);          //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL);      //使能P4数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT4_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT4_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P5口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT5_Init(void)<br />
{<br />
SetP5nInitLevelHigh(PIN_ALL);       //设置P5初始化电平<br />
SetP5nQuasiMode(PIN_ALL);         //设置P5为准双向口模式</p>
<pre><code>DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL);          //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL);      //使能P5数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT5_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT5_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P6口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT6_Init(void)<br />
{<br />
SetP6nInitLevelHigh(PIN_ALL);       //设置P6初始化电平<br />
SetP6nQuasiMode(PIN_ALL);         //设置P6为准双向口模式</p>
<pre><code>DisableP6nPullUp(PIN_ALL);          //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL);          //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL);      //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL);       //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL);      //使能P6数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT6_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT6_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 时钟初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void CLK_Init(void)<br />
{<br />
CLK_HSIOCK_Divider(1);            //设置高速外设时钟预分频系数</p>
<pre><code>CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

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

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

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

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

//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// USB库初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_Init(void)<br />
{<br />
usb_init();                         //初始化USB模块<br />
USB_SetIntPriority(0);            //设置中断为最低优先级<br />
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数<br />
set_usb_ispcmd(&quot;@STCISP#&quot;);         //设置USB不停电下载命令</p>
<pre><code>//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 等待USB配置完成函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_WaitConfiged(void)<br />
{<br />
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置<br />
WDT_Clear();                  //清看门狗定时器 (防止硬件自动使能看门狗)<br />
}</p>
<p>////////////////////////////////////////<br />
// USB设备接收数据中断回调程序<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
// OutNumber:USB设备接收到的数据长度<br />
// UsbOutBuffer:保存USB设备接收到的数据<br />
////////////////////////////////////////<br />
void USBLIB_OUT_Callback(void)<br />
{<br />
//&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_BEGIN&gt;&gt;<br />
// 在此添加中断函数用户代码<br />
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试<br />
// 在此处添加用户处理接收数据的代码<br />
//&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_END&gt;&gt;<br />
}</p>
<p>//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN&gt;&gt;<br />
// 在此添加用户函数实现代码<br />
//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_END&gt;&gt;</p>

圣灵主宰 发表于 2026-4-21 10:28:52

<p>STC32G12K1289.62实验箱程序2</p>
<p>主机模式</p>
<p>#include &quot;SPI.h&quot;</p>
<p>//回环测试<br />
uint8_t SPI_ReadWriteByte(uint8_t dat)<br />
{<br />
SPI_SendData(dat);          // 发数据<br />
while(!SPI_CheckFlag());    // 等待完成<br />
SPI_ClearFlag();<br />
return SPI_ReadData();      // 同时读到数据<br />
}</p>
<p>////////////////////////////////////////<br />
// SPI初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SPI_Init(void)<br />
{<br />
SPI_SwitchP2n();                  //选择SPI数据口: SS(P2.2), MOSI(P2.3), MISO(P2.4), SCLK(P2.5)</p>
<pre><code>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功能

//&lt;&lt;AICUBE_USER_SPI_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_SPI_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// SPI主机模式发送字节函数<br />
// 入口参数: dat (待发送的字节数据)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SPI_WriteByte(uint8_t dat)<br />
{<br />
SPI_SendData(dat);                  //触发主机发送数据<br />
while (!SPI_CheckFlag());         //等待发送完成<br />
SPI_ClearFlag();                  //清除中断标志<br />
}</p>
<p>////////////////////////////////////////<br />
// SPI主机模式读取字节函数<br />
// 入口参数: 无<br />
// 函数返回: 读取的字节数据<br />
////////////////////////////////////////<br />
uint8_t SPI_ReadByte(void)<br />
{<br />
SPI_SendData(0xff);               //触发主机读取数据(主机发送时钟信号)<br />
while (!SPI_CheckFlag());         //等待读取完成<br />
SPI_ClearFlag();                  //清除中断标志<br />
return SPI_ReadData();<br />
}</p>

圣灵主宰 发表于 2026-4-21 10:29:51

<p>从机   STC8H8K64U   9.62实验箱</p>
<p>#include &quot;config.h&quot;                     //默认已包含stdio.h、intrins.h等头文件</p>
<p>//&lt;&lt;AICUBE_USER_INCLUDE_BEGIN&gt;&gt;<br />
// 在此添加用户头文件包含<br />
//&lt;&lt;AICUBE_USER_INCLUDE_END&gt;&gt;</p>
<p>//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_BEGIN&gt;&gt;<br />
// 在此添加用户全局变量定义、用户宏定义以及函数声明<br />
uint8_t spi = 0;<br />
uint8_t spi_f,spi_j;</p>
<p>//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_END&gt;&gt;</p>
<p>////////////////////////////////////////<br />
// 项目主函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void main(void)<br />
{<br />
//&lt;&lt;AICUBE_USER_MAIN_INITIAL_BEGIN&gt;&gt;<br />
// 在此添加用户主函数初始化代码</p>
<pre><code>//&lt;&lt;AICUBE_USER_MAIN_INITIAL_END&gt;&gt;

SYS_Init();

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

while (1)
{

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

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

    //&lt;&lt;AICUBE_USER_MAIN_LOOP_END&gt;&gt;
}
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 系统初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SYS_Init(void)<br />
{<br />
EnableAccessXFR();                  //使能访问扩展XFR<br />
IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基</p>
<pre><code>//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户预初始化代码
//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_END&gt;&gt;

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);

//&lt;&lt;AICUBE_USER_INITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_INITIAL_CODE_END&gt;&gt;

EnableGlobalInt();                  //使能全局中断
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 微秒延时函数<br />
// 入口参数: us (设置延时的微秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_us(uint16_t us)<br />
{<br />
do<br />
{<br />
NOP(14);                        //(MAIN_Fosc + 500000) / 1000000 - 10<br />
} while (--us);<br />
}</p>
<p>////////////////////////////////////////<br />
// 毫秒延时函数<br />
// 入口参数: ms (设置延时的毫秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_ms(uint16_t ms)<br />
{<br />
uint16_t i;</p>
<pre><code>do
{
    i = MAIN_Fosc / 10000;
    while (--i);
} while (--ms);
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P2口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT2_Init(void)<br />
{<br />
SetP2nInitLevelHigh(PIN_ALL);       //设置P2初始化电平<br />
SetP2nQuasiMode(PIN_ALL);         //设置P2为准双向口模式</p>
<pre><code>DisableP2nPullUp(PIN_ALL);          //关闭P2内部上拉电阻
EnableP2nSchmitt(PIN_ALL);          //使能P2施密特触发
SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
SetP2nDigitalInput(PIN_ALL);      //使能P2数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT2_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT2_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P3口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT3_Init(void)<br />
{<br />
SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平<br />
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为准双向口模式<br />
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式</p>
<pre><code>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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT3_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT3_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P4口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT4_Init(void)<br />
{<br />
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初始化电平<br />
SetP4nInitLevelLow(PIN_0);          //设置P4.0初始化电平<br />
SetP4nQuasiMode(PIN_ALL);         //设置P4为准双向口模式</p>
<pre><code>DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL);          //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL);      //使能P4数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT4_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT4_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P5口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT5_Init(void)<br />
{<br />
SetP5nInitLevelHigh(PIN_ALL);       //设置P5初始化电平<br />
SetP5nQuasiMode(PIN_ALL);         //设置P5为准双向口模式</p>
<pre><code>DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL);          //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL);      //使能P5数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT5_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT5_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P6口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT6_Init(void)<br />
{<br />
SetP6nInitLevelHigh(PIN_ALL);       //设置P6初始化电平<br />
SetP6nQuasiMode(PIN_ALL);         //设置P6为准双向口模式</p>
<pre><code>DisableP6nPullUp(PIN_ALL);          //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL);          //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL);      //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL);       //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL);      //使能P6数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT6_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT6_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 时钟初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void CLK_Init(void)<br />
{<br />
CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频</p>
<pre><code>HIRC_24M();                         //选择内部预置的频率

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

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

//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// SPI初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SPI_Init(void)<br />
{<br />
SPI_SwitchP2n();                  //选择SPI数据口: SS(P2.2), MOSI(P2.3), MISO(P2.4), SCLK(P2.5)</p>
<pre><code>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功能

//&lt;&lt;AICUBE_USER_SPI_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_SPI_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// SPI主机模式发送字节函数<br />
// 入口参数: dat (待发送的字节数据)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SPI_WriteByte(uint8_t dat)<br />
{<br />
SPI_SendData(dat);                  //触发主机发送数据<br />
while (!SPI_CheckFlag());         //等待发送完成<br />
SPI_ClearFlag();                  //清除中断标志<br />
}</p>
<p>////////////////////////////////////////<br />
// SPI主机模式读取字节函数<br />
// 入口参数: 无<br />
// 函数返回: 读取的字节数据<br />
////////////////////////////////////////<br />
uint8_t SPI_ReadByte(void)<br />
{<br />
SPI_SendData(0xff);               //触发主机读取数据(主机发送时钟信号)<br />
while (!SPI_CheckFlag());         //等待读取完成<br />
SPI_ClearFlag();                  //清除中断标志<br />
return SPI_ReadData();<br />
}</p>
<p>////////////////////////////////////////<br />
// USB库初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_Init(void)<br />
{<br />
usb_init();                         //初始化USB模块<br />
USB_SetIntPriority(0);            //设置中断为最低优先级<br />
set_usb_ispcmd(&quot;@STCISP#&quot;);         //设置USB不停电下载命令</p>
<pre><code>//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_END&gt;&gt;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 等待USB配置完成函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_WaitConfiged(void)<br />
{<br />
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置<br />
WDT_Clear();                  //清看门狗定时器 (防止硬件自动使能看门狗)<br />
}</p>
<p>////////////////////////////////////////<br />
// USB设备接收数据处理程序<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
// bUsbOutReady:USB设备接收数据标志位<br />
// OutNumber:USB设备接收到的数据长度<br />
// UsbOutBuffer:保存USB设备接收到的数据<br />
////////////////////////////////////////<br />
void USBLIB_OUT_Done(void)<br />
{<br />
if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据<br />
{<br />
//&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_BEGIN&gt;&gt;<br />
// 在此添加中断函数用户代码<br />
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试<br />
// 在此处添加用户处理接收数据的代码<br />
if (UsbOutBuffer == 1)<br />
printf_usb(&quot;spi = %bX&quot;,spi);<br />
else if (UsbOutBuffer == 2)<br />
printf_usb(&quot;China !\r\n&quot;);</p>
<pre><code>    //&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_END&gt;&gt;
    usb_OUT_done();               //当前包的数据处理完成,通知USB主机可以发送下一包数据
}
</code></pre>
<p>}</p>
<p>//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN&gt;&gt;<br />
// 在此添加用户函数实现代码<br />
//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_END&gt;&gt;</p>

圣灵主宰 发表于 2026-4-21 10:33:24

上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3和P2.4不交叉,无效),P2.5和P2.5相连

狂热主宰 发表于 2026-4-21 10:56:51

圣灵主宰 发表于 2026-4-21 10:33
上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3 ...

两个实验箱各自测试
先看看各自和SPI的模块通信测试如何

狂热主宰 发表于 2026-4-21 10:59:39

圣灵主宰 发表于 2026-4-21 10:33
上面就是所有程序,为什么SPI无法通讯?
接线是两个实验箱的P2.2和P2.2相连,P2.3和P2.4交叉相连(试过P2.3 ...

有两种模式
主和从

圣灵主宰 发表于 2026-4-21 11:47:43

狂热主宰 发表于 2026-4-21 10:56
两个实验箱各自测试
先看看各自和SPI的模块通信测试如何

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

狂热主宰 发表于 2026-4-21 11:49:21

两种单片机支持



注意回环测试可能有影响
页: [1]
查看完整版本: SPI通讯问题