首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

香主,请教STM32 的两个SPI通信的问题

香主,请教STM32 的两个SPI通信的问题

我要用一个STM32主机,控制N个STM32从机,我现在还在调试一主一从,都有问题啊
我用的是两块板子,都用的SPI2,接收都是用的中断
连线:
主 从
MOSI——MOSI
MISO——MISO
SCK ——SCK
主机的NSS悬空,从机的NSS接地
主机配置
void SPI2_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //内部NSS信号由SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
// SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
SPI_Cmd(SPI2, ENABLE);
}

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure SPI2 pins: NSS, SCK, MISO and MOSI ----------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

void SPI2_IRQHandler(void)
{
u8 SPI_RxData;
u8 i,sum;
if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET);//SPI 接受缓存非空,收到数据
{
SPI_RxData= SPI_I2S_ReceiveData(SPI2); //接受一个字节RXData是接收变量
if(SPI_RxData == 0xaa)
SPI_RxCount=0;
SPI_RxBuffer[SPI_RxCount]=SPI_RxData;
SPI_RxCount++;
if((SPI_RxCount>2)&&(SPI_RxCount>=(SPI_RxBuffer[1]+2))&&(SPI_RxBuffer[0]!=0x00))
{
sum = 0;
for(i=0;i<SPI_RxBuffer[1]+1;i++)
sum+=SPI_RxBuffer;
if(SPI_RxBuffer==sum)
{
SPI_RxFlag = 0xff;

jieshou=0xff;
USART_TX(SPI_RxBuffer,SPI_RxCount);
}
SPI_RxCount = 0;
}

}
}

void SPI2_TX(u8 *Data,u8 Len) //SPI发送函数
{
u8 x;
for(x=0;x<Len;x++)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, Data[x]);
//Delay_1ms(1);

}
}


从机配置:

void SPI1_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
// SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
SPI_Cmd(SPI1, ENABLE);
}
其他的都一样

我程序是每次主机给从机发送一个命令,从机就给主机返回一包数据。
但是每次从机通过void SPI2_TX(u8 *Data,u8 Len) 给主机返回数据的时候,第一个字节可以发送成功,但是第二字节就会一直卡死在 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);这一句。当我单步,让主机一个字节一个字节的给从机发送,发现主机没给从机发送一个字节,从机就可以执行一步SPI2_TX(u8 *Data,u8 Len)中的SPI_I2S_SendData(SPI2, Data[x]);然后再跳到从机中断函数void SPI2_IRQHandler(void)。这是什么问题啊,怎么这么奇怪。也就是每次主机给从机发送一次数据,从机才可以给主机发送一次数据,否则就会一直等待 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)。请香主指点啊
void SPI2_TX(u8 *Data,u8 Len) //SPI发送函数
{
u8 x;
for(x=0;x<Len;x++)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, Data[x]);
//Delay_1ms(1);

}
}
返回列表