• 永兴集团

    产品
    永兴集团云 — 物联网云平台 零编程,组态拖拽即可实现远程监控。同时支持私有部署,拥有属于自己的软硬件一体化方案
    200
    +
    私有云项目
    数据本地化
    业务个性化
    10
    +
    万 公有云注册用户
    80%公有云功能免费
    付费VIP享自定义品牌服务
    永兴集团云官网
    永兴集团智造 — ODM/EMS 依托自动化、智能化、柔性化、透明化的智能工厂,
    提供代研、代料、代工一站式OEM/ODM服务
    永兴集团智造官网
    永兴集团智能 — 解决方案 打包提供云、管、边、端整体解决方案
    从问题诊断、方案设计,到实施落地、系统运维
    永兴集团智能官网
    新闻资讯
    AVR mega16 SPI双机通讯例子程序代码
    2011-04-21


    调试通过的AVR mega16 SPI双机通讯例子 (为新手设计,简单易懂)本程序实现的功能:主机发送1~255,丛机接收并在LED上显示出来。连接方式: 两个mega16最小系统板 PB4到PB7全部对连。
    本程序在本站的最小系统板上测试通过,我向你担保本程序的正确性。

    查看商品:ATmega16 开发板 AVR学习板 Mega16 核心板 (特价)

    ATmega16 开发板 AVR学习板 Mega16 核心板 (特价)AVR-Mini-DC-Mega16 核心板

    [code="C"]


    //ICC-AVR application builder : 2007-7-18 13:01:11
    // Target : M16
    // Crystal: 7.3728Mhz
    // 作者:古欣
    // AVR与虚拟仪器 [url]http://www.avrvi.com[/url]
    // 功能:SPI主机模式,循环发送从1~255

    #include <iom16v.h>
    #include <macros.h>

    void port_init(void)
    {
    PORTA = 0x00;
    DDRA = 0x00;
    PORTB = 0x00;
    DDRB = 0x00;
    PORTC = 0x00; //m103 output only
    DDRC = 0x00;
    PORTD = 0x00;
    DDRD = 0x00;
    }

    //SPI initialize
    // clock rate: 57599hz
    void spi_init(void)
    {
    PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
    DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB4);     //Set MOSI, SCK AND SS as outputs
    SPCR = 0x73; //setup SPI
    SPSR = 0x00; //setup SPI
    }

    //call this routine to initialize all peripherals
    void init_devices(void)
    {
    //stop errant interrupts until set up
    CLI(); //disable all interrupts
    port_init();
    spi_init();

    MCUCR = 0x00;
    GICR = 0x00;
    TIMSK = 0x00; //timer interrupt sources
    SEI(); //re-enable interrupts
    //all peripherals are now initialized
    }

    void SPI_MasterTransmit(char cData)
    {
    PORTB &=~ (1<<PB4); //强制接收方进入从模式
    SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
    /* 启动数据传输 */
    SPDR = cData;
    /* 等待传输结束 */
    while(!(SPSR & (1<<SPIF)))
    ;
    PORTB |= (1<<PB4);
    }

    void Delay(void) //延时,没有详细计算
    {
    unsigned int i,j;
    for(i=1000;i>0;i--)
    {
    for(j=200;j>0;j--)
    ;
    }
    }

    void main(void)
    {
    unsigned char i=0;
    init_devices();
    while(1)
    {
    for(i=255;i>0;i--)
    {
    SPI_MasterTransmit(i);
    Delay();
    }
    }
    }

    [/code]

    [code="c"]


    //ICC-AVR application builder : 2007-7-18 12:56:10
    // Target : M16
    // Crystal: 7.3728Mhz
    // 作者:古欣
    // AVR与虚拟仪器 [url]http://www.avrvi.com[/url]
    // 功能:从机模式,中断方式接收,并在LED上显示

    #include <iom16v.h>
    #include <macros.h>

    void port_init(void)
    {
    PORTA = 0x00;
    DDRA = 0xFF;
    PORTB = 0x00;
    DDRB = 0x00;
    PORTC = 0x00; //m103 output only
    DDRC = 0x00;
    PORTD = 0x00;
    DDRD = 0x00;
    }

    //SPI initialize
    // clock rate: 57599hz
    void spi_init(void)
    {
    SPCR = 0xE3; //setup SPI
    SPSR = 0x00; //setup SPI
    }

    #pragma interrupt_handler spi_stc_isr:11
    void spi_stc_isr(void)
    {
    //byte in SPDR has been sent/received
    PORTA = SPDR;
    }

    //call this routine to initialize all peripherals
    void init_devices(void)
    {
    //stop errant interrupts until set up
    CLI(); //disable all interrupts
    port_init();
    spi_init();

    MCUCR = 0x00;
    GICR = 0x00;
    TIMSK = 0x00; //timer interrupt sources
    SEI(); //re-enable interrupts
    //all peripherals are now initialized
    }

    void main(void)
    {
    init_devices();
    DDRB|=(1<<PB6); //MOSI 设置为输出
    while(1)
    ;//等待中断
    }

    [/code]

    工作日每天: 14:00~17:00
    抖音、天猫 "永兴集团旗舰店"

    关注永兴集团微信公众号
    了解更多信息

    永兴集团