stm8自带的spi从机不稳定,因此把io口模拟spi的程序和注意问题分享给大家。
本帖最后由 jianhong_wu 于 2015-6-17 13:39 编辑★坚鸿-深圳:
今天测试后发现,stm8自带的spi从机不稳定,发现只要中途一旦数据出错或者错位,那么后面接收到的数据就全部是错位或者说是错的,所以不得不放弃。后来我改用io口模拟spi,仅占用一个io口电平中断就可以了,但是有个地方大家一定要注意,就是务必保持这个电平中断是最高优先级的中断,可以让它抢占和嵌套任何中断,否则数据不稳定。我一开始的时候系统用了定时中断和电平中断,发现数据还是偶尔出错,后来把定时中断关闭了,只留电平中断,就没有再出现这个问题。这个现象告诉我们,以后凡是单片机通讯,就应该把通讯的相关中断设置为最高优先级,并且允许它抢占和嵌套任何中断。现在把stm8s105单片机的spi代码分享给大家,我是用IAR的编译环境,用stm8的库函数。
spi从机的初始化:
GPIO_Init(GPIOC,GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);//DATA线
GPIO_Init(GPIOC,GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);//CLK线
GPIO_Init(GPIOC,GPIO_PIN_2, GPIO_MODE_IN_FL_IT); //CE线,中断
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC,EXTI_SENSITIVITY_FALL_ONLY);
spi从机的CE电平中断接收一个字节代码:
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5) //CE的下降沿产生的电平中断
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
unsigned char ucSpiReadData=0;//必须初始化为0,很关键!
unsigned char i;
for(i=0;i<8;i++)
{
ucSpiReadData=ucSpiReadData<<1;
while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_5)==0)//时钟线
{
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2)!=0)
{
break;
}
}
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_6)!=0)//不能是1,只能判断非0.因为GPIO_ReadInputPin库函数读取的高电平不是1,而是非0。
{
ucSpiReadData=ucSpiReadData+1;
}
while(GPIO_ReadInputPin(GPIOC,GPIO_PIN_5)!=0)//时钟线,不能是1,只能判断非0.因为GPIO_ReadInputPin库函数读取的高电平不是1,而是非0。
{
if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_2)!=0)
{
break;
}
}
}
ucSpiBufferRecieve=ucSpiReadData;
if(ucSpiBufferCnt<const_spi_recieve_max)
{
ucSpiBufferCnt++;
}
ucSpiTimeFlag=0; //把累加时间清零
}
感谢鸿哥 !
页:
[1]