spi通讯失败
芯片选用是stc32g12k128,我使用SPI驱动74hc165和hc595,74hc165是读取按键键值,595是输出到LED数码管,muc做主机,硬件是没有问题的,用示波器看过波形,但软件配置不知道哪有问题,而且SPSTAT状态寄存器无法写入值(实例也一样),还有就是在全速运行下寄存器的值不能实时变化(包括变量,寄存器,keil的periodic window updata也勾上了),正常来说我按键按下muc就能收到165发送过来的按键信息,现在就是什么都没有,有没有大佬能看看哪有问题void GPIO_config(void){
P0_MODE_IO_PU(GPIO_Pin_5);
P0_MODE_IO_PU(GPIO_Pin_6);
P0_MODE_IO_PU(GPIO_Pin_2);
P0_MODE_IO_PU(GPIO_Pin_3);
P5_MODE_IO_PU(GPIO_Pin_3);
P2_MODE_IO_PU(GPIO_Pin_1);
P2_MODE_IO_PU(GPIO_Pin_2);
P2_MODE_IO_PU(GPIO_Pin_3);
P2_MODE_IO_PU(GPIO_Pin_4);
P2_MODE_IO_PU(GPIO_Pin_5);
// P2_MODE_IN_HIZ(GPIO_Pin_3);
// P2_MODE_OUT_PP(GPIO_Pin_2);
// P2_MODE_OUT_PP(GPIO_Pin_4);
// P2_MODE_OUT_PP(GPIO_Pin_5);
P3_MODE_IO_PU(GPIO_Pin_3);
P3_MODE_IO_PU(GPIO_Pin_4);
P1_MODE_IO_PU(GPIO_Pin_1);
P1_MODE_IO_PU(GPIO_Pin_0);
P1_MODE_IO_PU(GPIO_Pin_4);
}
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Enable = ENABLE; //SPI启动 ENABLE, DISABLE
SPI_InitStructure.SPI_SSIG = DISABLE; //片选位 ENABLE, DISABLE
SPI_InitStructure.SPI_FirstBit= SPI_MSB; //移位方向 SPI_MSB, SPI_LSB
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主从选择 SPI_Mode_Master, SPI_Mode_Slave
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟极性 SPI_CPOL_High, SPI_CPOL_Low
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //时钟相位 SPI_CPHA_1Edge,SPI_CPHA_2Edge
SPI_InitStructure.SPI_Speed = SPI_Speed_4; //SPI速度 SPI_Speed_4, SPI_Speed_16, SPI_Speed_64, SPI_Speed_128
SPI_Init(&SPI_InitStructure);
NVIC_SPI_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
SPI_SW(SPI_P22_P23_P24_P25); //SPI_P54_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P54_P40_P41_P43,SPI_P35_P34_P33_P32
//SPI_SS_2 = 1;
SPSTAT = 0xc0;
SPI_ClearFlag(); //清除 SPIF和WCOL 标志
//SPR0 = 0;
//SPR1 = 0;
HSPllClkConfig(MCLKSEL_HIRC,PLL_96M,123); //系统时钟选择,PLL时钟选择,时钟分频系数
HSSPI_Enable();
}
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXSFR(); //扩展SFR(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
EA = 1;
GPIO_config();
SPI_config();
//Timer_config();
//UART_config();
//RS485_EN = 0;
//RS485();
//WDT_CONTR = 0x24;//使能看门狗 溢出时间约为0.5s
P05 = 1;
m_LoopFlag = 2;
while (1)
{
//WDT_CONTR = 0x34;//清除看门狗,否则系统复位
<blockquote>RCK = 0;
你用个逻辑分析仪抓一下 嵌入式之路 发表于 2023-12-27 14:13
你用个逻辑分析仪抓一下
我用示波器看过,波形是正常的
页:
[1]