请问我这样设计,单片机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_();
}
为了帮助您更好地理解问题并解决问题,以下是一份专业的回复:
问题分析:单片机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. 使用代码调试工具验证: 通过调试工具快速验证设置是否正确。
希望以上回复对您解决该问题有所帮助!
[本文内容由国芯人工智能辅助生成,仅供参考]
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_();
}
======================================================
不要在乎型号,当同系列的 STC8H8K64U 来设置,注意管脚图的对比
https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf
如上,最新 STC8H数据手册
最新 AiCube@isp 软件:
深圳国芯人工智能有限公司-工具软件
神农鼎 发表于 2025-6-22 16:43
======================================================
您好,就是我按照您这种来编写是吗,
就是我倒是没有注重型号,就是感觉自己写的感觉没有问题,
只是SCLK引脚没有时钟输出想找找什么问题,
那我按照您给的试着去修改一下
SCLK作为输出设置推挽模式
页:
[1]