最近在做一个以STM32F407为主机与8个STM8S003进行一主多从的通讯板,目标是SPI总线能上5Mbit以上。
STM8S003的数据手册上写着,最高能达到8Mbit,这里先记下。
STM32F407一共用了两个SPI,分别是SPI1与SPI3,SPI1的时钟总线为APB2,即最大为84MHz,当然传输数据时,当然是达不到这个速率
的,而是37.5Mbit/S,为了能与STM8S003通讯,就得分频,84MHz/8MHz =10.5倍,所以只能16分频,即84MHz/16= 5.25MHz,即
5.25Mbit/S;
SPI3的时钟总线为APB1,即最大为42MHz,42MHz/5.25MHz=8分频
片选使用NSS硬件片选
STM32F407(主) STM8S003(从)
SCK -------> SCK
MOSI -------> MOSI
MISO -------> MISO
普通IO -------> NSS
STM32F407的主时钟倍频到168MHz,STM8S003的时钟设置为16MHz,一次性传输256byte,轮循发送,每间隔10ms就发送一次
把程序下载后,测试,发现在频率为5.25MHz的情况下,收到数据经常发生溢出错误码,SR寄存器的OVR位被置1,查看STM8S003中断的
汇编代码,发现需要执行大约23个机器周期。中断代码如下:
INTERRUPT_HANDLER(SPI_IRQHandler, 10)
{
if(SPI->SR & 0x01)
{
Data[RevCnt++] = SPI->DR;
if(RevCnt >= 256) RevCnt = 0;
}
}
所以想着将SPI的软件中断优先级设置为最高优先级,然后再降低SPI的时钟线,先设置为2.625Mbit/s。一试,居然就可以了,不再产
生OVR错误了。哈哈哈…… |