本帖最后由 achang85 于 2012-2-21 16:43 编辑
我要用一个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);
}
} |