找回密码
 立即注册
楼主: lyl1011

STC8H1K28必须加上串口2初始化,SPI才能正常工作, 不知程序错在哪

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-22 16:27:07
已绑定手机

2

主题

3

回帖

16

积分

新手上路

积分
16
发表于 7 天前 | 显示全部楼层
请问为什么STC8H1K28单片机按照代码设置,但是输出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_();
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-22 16:27:07
已绑定手机

2

主题

3

回帖

16

积分

新手上路

积分
16
发表于 7 天前 | 显示全部楼层
乘风*** 发表于 2024-6-3 16:25
PCON = 0x02; 后面要加几个NOP,等待MCU唤醒时钟稳定后再执行有效代码。
EA = 1;开启总中断代码在"drv_ua ...

您好帖主,请问我这样设计不对吗,为啥对单片机的时钟引脚进行检测发现无输出
//========================================================================
// 函数: void        SPI_Init(SPI_InitTypeDef *SPIx)
// 描述: SPI初始化程序.
// 参数: SPIx: 结构参数,请参考spi.h里的定义.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
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_();
}
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.2 (SS): 推挽输出(即使不使用,也建议配置)
      P2M1 &= ~(1 << 2);
      P2M0 |=  (1 << 2);  // 推挽输出
            // SCLK (P2.5) -> 推挽输出
      P2M1 &= ~(1 << 5);
      P2M0 |=  (1 << 5);
      // MOSI (P2.3) -> 推挽输出
      P2M1 &= ~(1 << 3);
      P2M0 |=  (1 << 3);
      // MISO (P2.4) -> 高阻输入
      P2M1 |=  (1 << 4);
      P2M0 &= ~(1 << 4);
                        // P2.6~P2.7: 准双向口(按您要求)
      P2M1 &= ~(0xC0);  // 清除 P2.6/P2.7 的 M1 位 (1100 0000)
      P2M0 &= ~(0xC0);  // 清除 P2.6/P2.7 的 M0 位
                  SPI_SCLK_2  = 0;
                        SPI_MOSI_2  = 1;
                        P_SW1  = 0x04;
                   SPI_Init( );
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-06-28 21:18:20
已绑定手机

40

主题

2079

回帖

7165

积分

论坛元老

积分
7165
发表于 6 天前 | 显示全部楼层
翰st*** 发表于 2025-6-22 17:33
您好帖主,请问我这样设计不对吗,为啥对单片机的时钟引脚进行检测发现无输出
//======================= ...

先烧录官方例子,或者附件例子到芯片里测试,功能验证正常后再进行修改或者移植。

用别人验证过的代码先排查硬件是否正常,检查板子是否有虚焊或者短路,还是不行的话可断开SPI外围元器件再用示波器测量脚位信号。

SPI主从收发-串口打印.zip

18.91 KB, 下载次数: 0

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 03:43 , Processed in 0.298658 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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