翰study 发表于 6 天前

请问我这样设计,单片机AI8H1K28,SCLK没有时钟信号是什么原因导致的

void main()
{
      //总体设置(允许访问特殊功能寄存器,允许触发中断)
      P_SW2 |= 0x80;                                                //使能访问特殊功能寄存器(使能后才能访问特殊功能寄存器)
      EA = 1;                                                                  //中断允许寄存器(CPU开放中断)
    //单片机管脚初始化(对管脚进行设置)
    //LED初始化,点亮
    //LED_Init();
    //PWM管脚初始化
            P1M1 = 0x00;      //设置P1的所有管脚都为准双向口
            P1M0 = 0x00;
            // P3.3 ~ P3.7 配置为高阻输入:对应 P3M1 的 bit3~bit7 置 1,P3M0 的 bit3~bit7 置 0
      P3M1 |= 0xF8;// 1111 1000:bit3~bit7 置 1(高阻输入需要 PnM1=1)
      P3M0 &= 0x07;// 0000 0111:bit3~bit7 置 0(高阻输入需要 PnM0=0)
      // P3 其他引脚(P3.0 ~ P3.2)保持准双向口:默认已为 0(若被修改过,可显式清 0)
      P3M1 &= 0x07;// 确保 P3.0 ~ P3.2 的 PnM1=0
      P3M0 &= 0x07;// 确保 P3.0 ~ P3.2 的 PnM0=0
                        // P2.0 ~ P2.1 配置为高阻输入:对应 P2M1 的 bit0~bit1 置 1,P2M0 的 bit0~bit1 置 0
      P2M1 |= 0x03;// 0000 0011:bit0~bit1 置 1(高阻输入需要 PnM1=1)
      P2M0 &= 0xFC;// 1111 1100:bit0~bit1 置 0(高阻输入需要 PnM0=0)
      // P2 其他引脚(P2.2 ~ P2.7)保持准双向口:默认已为 0(若被修改过,可显式清 0)
      P2M1 &= 0xFC;// 确保 P2.2 ~ P2.7 的 PnM1=0
      P2M0 &= 0xFC;// 确保 P2.2 ~ P2.7 的 PnM0=0
                        P_SW1= 0x04;设置(2.2-2.5)
                        SPI_SCLK_2= 0;
                        SPI_MOSI_2= 1;
                     SPI_Init( );
}
void      SPI_Init(void)
{
//      if(SPIx->SPI_SSIG == ENABLE)                        SPCTL |=(1<<7);      //conform Master or Slave by SPI_Mode(ignore SS)
//      else                                                                        SPCTL &= ~(1<<7);      //conform Master or Slave by SS pin.
//      SPI_Start(SPIx->SPI_Enable);
//      SPI_FirstBit_Set(SPIx->SPI_FirstBit);
//      SPI_Mode_Set(SPIx->SPI_Mode);
//      SPI_CPOL_Set(SPIx->SPI_CPOL);
//      SPI_CPHA_Set(SPIx->SPI_CPHA);
//      SPI_Clock_Select(SPIx->SPI_Speed);
          SPI_SSIG_Set(ENABLE);      //conform Master or Slave by SPI_Mode(ignore SS)
          SPI_Start(ENABLE);
          SPI_FirstBit_Set(SPI_MSB);
          SPI_Mode_Set(SPI_Mode_Master);
          SPI_CPOL_Set(SPI_CPOL_Low);
          SPI_CPHA_Set(SPI_CPHA_2Edge);
          SPI_Clock_Select( SPI_Speed_4);
      
          SPI_RxTimerOut = 0;
          B_SPI_Busy = 0;
      
}
//========================================================================
// 函数: void SPI_WriteByte(u8 dat)
// 描述: SPI发送一个字节数据.
// 参数: dat: 要发送的数据.
// 返回: none.
// 版本: V1.0, 2020-09-14
//========================================================================
void      SPI_WriteByte(u8 dat)                //SPI发送一个字节数据
{
      SPDAT = dat;
      while (!(SPSTAT & SPIF)); // 等待传输完成
SPSTAT = 0x80;          // 清除传输完成标志
}
//========================================================================
// 函数: void SPI_WriteWord(unsigned int cmd)
// 描述: SPI发送两个字节数据.
// 参数: dat: 要发送的数据.
// 返回: none.
// 版本: V1.0, 2020-09-14
//========================================================================
void SPI_WritewWord(unsigned int cmd)
      {
    SPI_WriteByte(cmd >> 8); // 发送高字节(控制+地址)
    SPI_WriteByte(cmd);      // 发送低字节(数据)
    // 延时确保满足t8时序要求(最小20ns)
    _nop_();
                _nop_();
                _nop_();
}

国芯人工智能 发表于 6 天前

为了帮助您更好地理解问题并解决问题,以下是一份专业的回复:

问题分析:单片机SCLK没有时钟信号导致void

您提到单片机SCLK没有时钟信号,这通常与 SPI 通信的主信号(SPISigma)或子信号(SPISubSigma)设置不正确相关。以下是一些可能的原因和解决方法:

1. 主信号(SPISigma)和子信号(SPISubSigma)设置不正确

在 SPI 通信中,主信号和子信号是用于同步时钟的两个信号。如果主信号或子信号未正确启用或在错误的时钟周期启用,可能导致 SCLK 没有时钟信号。

解决方法:
检查主信号(SPISigma)和子信号(SPISubSigma)的设置:
主信号(SPISigma):在 SPICpha 或 SPISigma 标签中,通常需要启用( enabled = 1)。
子信号(SPISubSigma):在 SPISigma 标签中,通常需要启用( enabled = 1)。
调整 SPIStart:
检查 SPIStart 的设置,确保主信号和子信号在正确时钟周期开始发送数据。
调整 SPICpha:
SPICpha 节点用于同步主信号和子信号,确保它们在正确时钟周期同步。

示例代码调整:
cpp
// 如果 SPISigma == ENABLE
SPISigmaSet(Enable);
// 同时,确保 SPICpha 已经正确设置
SPICphaSet(SPICpha2Edge);

2. SPIStart 和 SPICpha 的设置不正确

SPIStart:
SPIStart 设置主信号(SPISigma)在正确时钟周期开始发送数据。
通常,主信号(SPISigma)和子信号(SPISubSigma)在不同的时钟周期中同步,但需要确保它们在正确时钟周期开始时同时启用。

SPICpha:
SPICpha 节点用于同步主信号和子信号,确保它们在正确时钟周期同步。

示例代码调整:
cpp
// 如果 SPISigma == ENABLE
SPISigmaSet(Enable);
// 如果 SPICpha == ENABLE
SPICphaSet(SPICpha2Edge);

3. SPIRxTimerout 的设置

在 SPI 通信中,需要在正确时钟周期发送数据。如果 timerout(SPIRxTimerout)在错误时钟周期开启,可能导致数据发送错误。

解决方法:
检查 timerout 的设置,确保它在主信号和子信号在正确时钟周期同时开启。
如果 timerout 未在正确时钟周期开启,可以将其设置为 1,并在相应的时钟周期发送数据。

示例代码调整:
cpp
// 在主信号和子信号在正确时钟周期同时开启 timerout
SPIRxTimerout = 1;

// 在主信号和子信号在正确时钟周期发送数据
SPIWriteByte(u8 dat);

4. 使用代码调试工具

为了更直观地验证设置是否正确,您可以使用以下工具:
Visual Studio Code:使用调试工具(如 Run、Step、Discover 等)快速验证设置。
Code::Blocks:在线编译器和调试工具。
TDB:在主程序中设置 TDB 以查看变量值。

总结

1. 检查主信号(SPISigma)和子信号(SPISubSigma)的设置: 确保它们在正确时钟周期同时启用。
2. 调整 SPIStart 和 SPICpha 的设置: 确保主信号和子信号在正确时钟周期同时发送数据。
3. 检查 SPIRxTimerout 的设置: 确保在主信号和子信号在正确时钟周期同时发送数据。
4. 使用代码调试工具验证: 通过调试工具快速验证设置是否正确。

希望以上回复对您解决该问题有所帮助!

[本文内容由国芯人工智能辅助生成,仅供参考]

翰study 发表于 6 天前

STC8H1K28单片机SPI通信,SCLK引脚没有信号 | 尝试下 AiCube 生成的 SPI代码

void main()
{
      //总体设置(允许访问特殊功能寄存器,允许触发中断)
      P_SW2 |= 0x80;                                                //使能访问特殊功能寄存器(使能后才能访问特殊功能寄存器)
      EA = 1;                                                                  //中断允许寄存器(CPU开放中断)
    //单片机管脚初始化(对管脚进行设置)
    //LED初始化,点亮
    //LED_Init();
    //PWM管脚初始化
            P1M1 = 0x00;      //设置P1的所有管脚都为准双向口
            P1M0 = 0x00;
            // P3.3 ~ P3.7 配置为高阻输入:对应 P3M1 的 bit3~bit7 置 1,P3M0 的 bit3~bit7 置 0
      P3M1 |= 0xF8;// 1111 1000:bit3~bit7 置 1(高阻输入需要 PnM1=1)
      P3M0 &= 0x07;// 0000 0111:bit3~bit7 置 0(高阻输入需要 PnM0=0)
      // P3 其他引脚(P3.0 ~ P3.2)保持准双向口:默认已为 0(若被修改过,可显式清 0)
      P3M1 &= 0x07;// 确保 P3.0 ~ P3.2 的 PnM1=0
      P3M0 &= 0x07;// 确保 P3.0 ~ P3.2 的 PnM0=0
                        // P2.0 ~ P2.1 配置为高阻输入:对应 P2M1 的 bit0~bit1 置 1,P2M0 的 bit0~bit1 置 0
      P2M1 |= 0x03;// 0000 0011:bit0~bit1 置 1(高阻输入需要 PnM1=1)
      P2M0 &= 0xFC;// 1111 1100:bit0~bit1 置 0(高阻输入需要 PnM0=0)
      // P2 其他引脚(P2.2 ~ P2.7)保持准双向口:默认已为 0(若被修改过,可显式清 0)
      P2M1 &= 0xFC;// 确保 P2.2 ~ P2.7 的 PnM1=0
      P2M0 &= 0xFC;// 确保 P2.2 ~ P2.7 的 PnM0=0
                        P_SW1= 0x04;设置(2.2-2.5)
                        SPI_SCLK_2= 0;
                        SPI_MOSI_2= 1;
                     SPI_Init( );
}
void      SPI_Init(void)
{
//      if(SPIx->SPI_SSIG == ENABLE)                        SPCTL |=(1<<7);      //conform Master or Slave by SPI_Mode(ignore SS)
//      else                                                                        SPCTL &= ~(1<<7);      //conform Master or Slave by SS pin.
//      SPI_Start(SPIx->SPI_Enable);
//      SPI_FirstBit_Set(SPIx->SPI_FirstBit);
//      SPI_Mode_Set(SPIx->SPI_Mode);
//      SPI_CPOL_Set(SPIx->SPI_CPOL);
//      SPI_CPHA_Set(SPIx->SPI_CPHA);
//      SPI_Clock_Select(SPIx->SPI_Speed);
          SPI_SSIG_Set(ENABLE);      //conform Master or Slave by SPI_Mode(ignore SS)
          SPI_Start(ENABLE);
          SPI_FirstBit_Set(SPI_MSB);
          SPI_Mode_Set(SPI_Mode_Master);
          SPI_CPOL_Set(SPI_CPOL_Low);
          SPI_CPHA_Set(SPI_CPHA_2Edge);
          SPI_Clock_Select( SPI_Speed_4);
      
          SPI_RxTimerOut = 0;
          B_SPI_Busy = 0;
      
}
//========================================================================
// 函数: void SPI_WriteByte(u8 dat)
// 描述: SPI发送一个字节数据.
// 参数: dat: 要发送的数据.
// 返回: none.
// 版本: V1.0, 2020-09-14
//========================================================================
void      SPI_WriteByte(u8 dat)                //SPI发送一个字节数据
{
      SPDAT = dat;
      while (!(SPSTAT & SPIF)); // 等待传输完成
SPSTAT = 0x80;          // 清除传输完成标志
}
//========================================================================
// 函数: void SPI_WriteWord(unsigned int cmd)
// 描述: SPI发送两个字节数据.
// 参数: dat: 要发送的数据.
// 返回: none.
// 版本: V1.0, 2020-09-14
//========================================================================
void SPI_WritewWord(unsigned int cmd)
      {
    SPI_WriteByte(cmd >> 8); // 发送高字节(控制+地址)
    SPI_WriteByte(cmd);      // 发送低字节(数据)
    // 延时确保满足t8时序要求(最小20ns)
    _nop_();
                _nop_();
                _nop_();
}

神农鼎 发表于 6 天前





======================================================






不要在乎型号,当同系列的 STC8H8K64U 来设置,注意管脚图的对比







神农鼎 发表于 6 天前

https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf
如上,最新 STC8H数据手册

最新 AiCube@isp 软件:

深圳国芯人工智能有限公司-工具软件

翰study 发表于 6 天前

神农鼎 发表于 2025-6-22 16:43
======================================================


您好,就是我按照您这种来编写是吗,
就是我倒是没有注重型号,就是感觉自己写的感觉没有问题,
只是SCLK引脚没有时钟输出想找找什么问题,
那我按照您给的试着去修改一下

DebugLab 发表于 5 天前

SCLK作为输出设置推挽模式
页: [1]
查看完整版本: 请问我这样设计,单片机AI8H1K28,SCLK没有时钟信号是什么原因导致的