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_();
}
乘风飞扬 发表于 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( );
} 翰study 发表于 2025-6-22 17:33
您好帖主,请问我这样设计不对吗,为啥对单片机的时钟引脚进行检测发现无输出
//======================= ...
先烧录官方例子,或者附件例子到芯片里测试,功能验证正常后再进行修改或者移植。
用别人验证过的代码先排查硬件是否正常,检查板子是否有虚焊或者短路,还是不行的话可断开SPI外围元器件再用示波器测量脚位信号。
页:
1
[2]