打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
spi接口使用
userphoto

2010.10.17

关注
主机SPI初始化:

/*SPI接口初始化*/
void SPI_MasterInit(void) {

    DDRB |= (1<<SPI_MOSI) | (1<<SPI_SCK) |(1<<SPI_SS);/* 设置MOSI,SCK,SS 为输出,其他为输入 */
    PORTB=~((1<<SPI_SS)|(1<<SPI_MOSI)|(1<<SPI_MISO)|(1<<SPI_SCK));
                                        //配置拉电阻

    SPCR = (1<<SPE) | (1<<MSTR)
        | (1<<SPR1) | (1<<SPR0);/* 使能SPI主机模式,设置时钟速率为fck/128 */
}

向从机发命令,写数据

/*-----------------------------------------------------------------------
Single_SPI    : 使用SPI接口读写数据到DS1302
 
输入参数:    command:    命令选择;
            wdata:        写入的数据;
返回值        rdata:        读回的数据;   
   (SPI的收发是同时进行的)
-----------------------------------------------------------------------*/

unsigned char Single_SPI(unsigned char command,unsigned char wdata)
{
    unsigned char rdata;
    EnDS1302;                            // 使能LCD

    _delay_us(10);
    SPDR = command;                         // 传送命令到SPI寄存器

    loop_until_bit_is_set(SPSR,SPIF);    // 等待数据传送完?

    _delay_us(10);
    SPDR = wdata;                         // 传送数据到SPI寄存器

    loop_until_bit_is_set(SPSR,SPIF);    // 等待数据传送完?

    rdata=SPDR;                            // 读取数据

    DiDS1302;                            // 关断LCD SPI通讯

    _delay_us(10);
    return rdata;
}

向从机写入一批数据

/*-----------------------------------------------------------------------
Burst_SPI : 使用SPI接口读写一批数据到
 
输入参数:    CMD:        选择Clock/RAM,选择读写
            lenth:        数据长度
            pwdata:        写入数据的缓冲区;
            prdata:        读回数据的缓冲区;    
   (SPI的收发是同时进行的)
读CLOCK的数据从SECOND寄存器开始,到CONTROL寄存器,最大8字节
写CLOCK的数据必须一次写完8个字节
读写RAM的数据从 RAM0地址开始,到RAM30地址,最大31字节
-----------------------------------------------------------------------*/

void Burst_SPI(unsigned char CMD,unsigned char len,
                        unsigned char *pwdata,unsigned char *prdata)
{
    EnDS1302;                                // 使能SPI通讯

    _delay_us(10);
    SPDR=CMD;                                // 传送命令到SPI寄存器

    loop_until_bit_is_set(SPSR,SPIF);        // 等待数据传送完?

    _delay_us(10);
    while (len--)
    {
        SPDR = *pwdata++;                     // 传送数据到SPI寄存器

        loop_until_bit_is_set(SPSR,SPIF);    // 等待数据传送完?

        *prdata++=SPDR;                        // 读取数据

    };
    DiDS1302;                                // 关断SPI通讯

    _delay_us(10);
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【转】单片机SPI接口和AD7799通信程序
串行接口SPI接口应用设计
ATmage128 操作16位AD芯片MAX1168的完整程序
关于NRF24L01无线模块的C52双向通讯C程序(中文详解)
单片机入门培训专题(二十三) - DS1302时钟芯片详解②
基于单片机的物联网图像采集系统应用设计
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服