高级会员

- 积分
- 560
- 金钱
- 560
- 注册时间
- 2016-4-12
- 在线时间
- 230 小时
|
我设置好主从机后,分别下载两个STM32板子上,然后从机收到数据后,从串口上打印出来,以下是遇到的问题:
1、主机发送数据,但是自身会进入SPI接收中断中,不解。
2、主机向从机发送数据,从机有时候会出现乱码或者丢失数据。
3、重启主机后,会导致从机接收乱码。
根据以上的问题,我查看了吧里的帖子,第一个问题没找到第2个问题如果设置一个流控或者什么的会不会可以解决?第3个问题我感觉应该都跟SCK有关系,但是不知道怎么解决。
请原子哥或者吧里的吧友们给点参考意见,万分感谢
贴出部分代码:
主机:
[mw_shl_code=applescript,true]void SPI1_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTAê±Öóê1Äü
RCC->APB2ENR|=1<<12; //SPI1ê±Öóê1Äü
//ÕaàïÖ»Õë¶ÔSPI¿ú3õê¼»ˉ
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7¸′óà ×î′óËù¶è50MHZêä3ö¸′óÃÇ¿íÆíì
GPIOA->ODR|=0X7<<5; //PA5.6.7éÏà-
SPI1->CR1|=0<<10;//è«Ë«1¤Ä£ê½
SPI1->CR1|=1<<9; //èí¼tnss1üàí
SPI1->CR1|=0<<8; //Clear ZERO?????
SPI1->CR1|=0<<2; //SPI Slave»ú
SPI1->CR1|=0<<11;//8bitêy¾Y¸ñê½ Set 1??????
SPI1->CR1|=1<<1; //¿ÕÏDÄ£ê½ÏÂSCKÎa1 CPOL=1
SPI1->CR1|=1<<0; //êy¾Y2éÑù′óμú¶t¸öê±¼ä±ßÑØ¿aê¼,CPHA=1
SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR2 |= 1<<6;
MY_NVIC_Init(3,2,SPI1_IRQn,2);
SPI1->CR1|=1<<6; //SPIé豸ê1Äü
// SPI1_ReadWriteByte(0xff);//Æô¶ˉ′«êä(Ö÷òa×÷óãoά3ÖMOSIÎa¸ß)
} [/mw_shl_code]
从机:
[mw_shl_code=applescript,true]void SPI1_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTAê±Öóê1Äü
RCC->APB2ENR|=1<<12; //SPI1ê±Öóê1Äü
//ÕaàïÖ»Õë¶ÔSPI¿ú3õê¼»ˉ
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7¸′óà ×î′óËù¶è50MHZêä3ö¸′óÃÇ¿íÆíì
GPIOA->ODR|=0X7<<5; //PA5.6.7éÏà-
SPI1->CR1|=0<<10;//è«Ë«1¤Ä£ê½
SPI1->CR1|=1<<9; //èí¼tnss1üàí
SPI1->CR1|=1<<8;
SPI1->CR1|=1<<2; //SPIÖ÷»ú
SPI1->CR1|=0<<11;//8bitêy¾Y¸ñê½ »1êÇ16λ
SPI1->CR1|=1<<1; //¿ÕÏDÄ£ê½ÏÂSCKÎa1 CPOL=1
SPI1->CR1|=1<<0; //êy¾Y2éÑù′óμú¶t¸öê±¼ä±ßÑØ¿aê¼,CPHA=1
SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR2 |= 1<<6;
MY_NVIC_Init(3,2,SPI1_IRQn,2);
SPI1->CR1|=1<<6; //SPIé豸ê1Äü
//SPI1_ReadWriteByte(0xff);//Æô¶ˉ′«êä(Ö÷òa×÷óãoά3ÖMOSIÎa¸ß)
} [/mw_shl_code]
[mw_shl_code=applescript,true]void SPI1_SendByte(u8 TxData)
{
u16 retry=0;
while((SPI1->SR&1<<1)==0)//μè′y·¢ËíÇø¿Õ
{
retry++;
if(retry>0XFFFE) return;
}
SPI1->DR=TxData; //·¢Ëíò»¸öbyte
}
u8 SPI1_ReceiveByte(void)
{
u16 retry=0;
while((SPI1->SR&1<<0)==0) //μè′y½óêÕíêò»¸öbyte
{
retry++;
if(retry>0XFFFE)return 0;
}
return SPI1->DR; //·μ»ØêÕμ½μÄêy¾Y
}
void SPI1_IRQHandler(void)
{
uint8_t data,sta;
if((SPI1->SR &(1<<0)) == 1)
{
SPI_DATA[SPI_SIZE] = data;
SPI_SIZE++;
if(SPI_SIZE>SPI_LENGTH)
{
SPI_SIZE = 0;
}
USART1->DR = data;
while((USART1->SR &(1<<6)) == 0);
}
}[/mw_shl_code]
|
|