STM32外接了一篇AD7327芯片,使用SPI2接口通信,7327在进行每个寄存器的配置和数据读取时需要先把CS管教拉低,单个寄存器配置完成和数据读取完成后腰拉高CS,下次通信时再拉低。电路中把STM32的NSS脚和AD7327的CS脚直接连接,使用SPI的硬件配置NSS管教模式,现在不知道如何在每次通信完后拉高NSS,使用SPI_SSOutputCmd()函数完全没有效果,求教各位前辈如何处理。
void SPI2_Config(void)
{
u8 i;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线全双工模式,或改为双线单向接收
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//16位模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行时钟稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第一个时钟沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS由外部管脚管理,在主模式下拉低NSS通知其他从设备
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//16分频,2MHz波特率
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位开始传输
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC多项式不设置,缺省值
SPI_Init(SPI2, &SPI_InitStructure);
SPI_CalculateCRC(SPI2,DISABLE);
SPI_SSOutputCmd(SPI2, ENABLE);
SPI_Cmd(SPI2, ENABLE);
SPI_SSOutputCmd(SPI2, DISABLE);
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, ENABLE);
SPI_I2S_SendData(SPI2 , 0xAAA0); //范围寄存器1
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, DISABLE);
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, ENABLE);
SPI_I2S_SendData(SPI2 , 0xEAA0); //范围寄存器2
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, DISABLE);
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, ENABLE);
SPI_I2S_SendData(SPI2 , 0xFF80); //配置队列寄存器
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, DISABLE);
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, ENABLE);
SPI_I2S_SendData(SPI2 , 0x9638); //控制寄存器
for (i = 40; i != 0; i--)
{
}
SPI_SSOutputCmd(SPI2, DISABLE);
for (i = 40; i != 0; i--)
{
}
// GPIO_ResetBits(GPIOB, PB_AD_IN);
SPI_I2S_ClearITPendingBit(SPI2, SPI_IT_CRCERR);
// SPI_Cmd(SPI2, DISABLE);
SPI_SSOutputCmd(SPI2, DISABLE);
} |