打印
[AVR单片机]

请教用SPI模块进行通讯时的时钟速度设置

[复制链接]
4921|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 古道热肠 于 2013-8-21 23:10 编辑

AVR的ISP编程器输出的SPI时钟速度有如下6种:
芯片主晶振是3.6864,前面4种SPI通讯时钟速度只要改变SPCR和SPSR即可实现。最后两种极低频率的SPI通讯如何设置,想不明白,能想到的只有用软件模拟SPI通讯,用定时器延时才能实现,比较麻烦,请大家说说有没有简单点的办法,先谢谢大家。

AVR_ISP_SetClock.JPG (47.74 KB )

AVR_ISP_SetClock.JPG

相关帖子

沙发
古道热肠|  楼主 | 2013-8-21 23:12 | 只看该作者
AVR芯片SPI输出的最低频率为Fosc/128 = 28.8K,设置频率加倍为1时,SPI通讯时钟就是57.6KHz了。

使用特权

评论回复
板凳
qin552011373| | 2013-8-22 21:34 | 只看该作者
个别芯片有低频的时钟吧  高频的时钟肯定达不到   低频的没问题

使用特权

评论回复
地板
古道热肠|  楼主 | 2013-8-23 22:49 | 只看该作者
qin552011373 发表于 2013-8-22 21:34
个别芯片有低频的时钟吧  高频的时钟肯定达不到   低频的没问题

谢谢关注,现在的情况是硬件选用了高频3.6864M晶振,参考了一下网上的设计,用软件模拟SPI通讯能做到比较低的通讯数据流。打算用定义器2做精确延时,AVR的定时器2虽然只有8位宽度,但输入的脉冲可以是振荡信号预分频,因而可以实现较长时间的延时。

使用特权

评论回复
5
qin552011373| | 2013-8-24 07:46 | 只看该作者
古道热肠 发表于 2013-8-23 22:49
谢谢关注,现在的情况是硬件选用了高频3.6864M晶振,参考了一下网上的设计,用软件模拟SPI通讯能做到比较 ...

而且软件模拟也有较高的通用性  可以很方便的移植   有问题欢迎继续交流  

使用特权

评论回复
6
古道热肠|  楼主 | 2013-8-24 16:57 | 只看该作者
呵呵,已经搞定了

unsigned char ucSoftSPIDelayCount;                //延时计数器长度
#define SoftDelay4K_Value 15        //实际输出为3600
#define SoftDelay1K_Value 47        //实际输出为1200
//以下部分为实现Soft SPI模拟通讯新增
void SoftSPIDelay(void)
{
        TIFR |= 0x80;        //先将OCF2标志位清零       
        TCNT2 = 0;
//        OCR2 = 15;                //3.6K
//        OCR2= 47;                //1.2K
        OCR2 = ucSoftSPIDelayCount;
        while(1)
        {
                if(TIFR & 0x80)
                {
                        break;
                }
        }
        //延时时间到退出
}


uchar SoftSPI_Transfer8(uchar ucWriteData)
{
        uchar ucReadData;
        uchar ucCount;
       
        ucReadData = 0;       
        for(ucCount=0; ucCount<8; ucCount++)
        {
                if(ucWriteData & 0x80)
                {
                        PORTB |= BIT5_POS;       
                }
                else
                {
                        PORTB &= BIT5_NEG;       
                }

                SoftSPIDelay();
               
                PORTB |= BIT7_POS;                //SCK = High
                ucWriteData <<= 1;

                ucReadData <<= 1;
                if(PINB & 0x40)                //Check PB6
                {
                        ucReadData |= 0x01;
                }
                SoftSPIDelay();
               
                PORTB &= BIT7_NEG;                //SCK = Low
        }

        return(ucReadData);
}

初始化定时器2的相关部分如下所示:

        //Timer2  (Soft SPI Clock Delay)
        OCR2 = 15;
        TCNT2 = 0;
//        TCCR2 = 0x1C;                //100 = 64分频  输出的脉冲为57600 除以16后就成3600,信号输出到OC2
        TCCR2 = 0x0C;                //COM20 COM21 = 00 ,信号不与OC2相连
//        TIMSK |= 0x80;                //OCIE2 = 1,使能OCIE2

使用特权

评论回复
7
qin552011373| | 2013-8-25 08:40 | 只看该作者
不错不错   恭喜

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝