void YJ_SPI1_CSH(unsigned char moshi,unsigned char ML) //SPI_1初始化
{
RCC->APB2PCENR|=0x1<<2; //IO 的 PA 端口模块时钟使能位
GPIOA->CFGLR&=~0xffff0000;
GPIOA->CFGLR|=(0xb<<16|0xb<<20|0x8<<24|0xb<<28);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_SetBits(GPIOA, GPIO_Pin_5);
GPIO_SetBits(GPIOA, GPIO_Pin_6);
GPIO_SetBits(GPIOA, GPIO_Pin_7);
// PA|=0Xf0;
// GPIOA->OUTDR=PA;
RCC->APB2PCENR|=0x1<<12; //模块时钟开启
SPI1->CTLR1&=~(0x1<<15); //选择双线双向模式
SPI1->CTLR1|=0x1<<11; //设置为16位
SPI1->CTLR1&=~(0x1<<10); //全双工模式
SPI1->CTLR2|=0X1<<2; //SS 输出使能
SPI1->CTLR1&=~(0x1<<9); //硬件控制 NSS 引脚
// SPI1->CTLR1|=0x1<<9; //软件控制 NSS 引脚
// SPI1->CTLR1|=0x1<<8; //NSS 为高电平
SPI1->CTLR1&=~(0x1<<7); //先发送高低位复位
SPI1->CTLR1|=ML<<7; //设置先发高位还是地位1:先发送 LSB;0:先发送 MSB
SPI1->CTLR1&=~(0x7<<3); //波特率设置域,在通讯时不可以修改此域2分频
SPI1->CTLR1|=(0x7<<3);
SPI1->CTLR1|=1<<2; //配置为主设备
SPI1->CTLR1&=~0x3; //
SPI1->CTLR1|=moshi&0x3; //
SPI1->CTLR2|=0x1<<7; //发送缓冲区空中断使能位
SPI1->CTLR1|=1<<6; //启用 SPI
// GPIO_ResetBits(GPIOA, GPIO_Pin_4);
//PA&=~0X10;
//GPIOA->OUTDR=PA;
*(volatile unsigned int *)0xE000E804&=~(0xff<<8); //复位
*(volatile unsigned int *)0xE000E804|=0xc0<<8; //优先级配置位中高 2 位为抢占位,4 级中断嵌套;
*(volatile unsigned int *)0xE000E448&=~(0xff<<16); //嵌套0
*(volatile unsigned int *)0xE000E104=0x1<<19; //使能中断
}
void SPI1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); //SP1中断函数
void SPI1_IRQHandler(void)
{
if(SPI1_TXE)
{
js++;
SPI1_DR=0x123;
}
}
用逻辑分析仪发现NSS总是会有毛刺,同时MOSI也会有,导致数据不正确。(用软件控制NSS和硬件控制NSS都会有毛刺)