zoukankan      html  css  js  c++  java
  • S3C2440的SPI解析

    S3C2440A的串行外设接口(SPI)可以与串行数据传输连接。S3C2440A包含了2SPI,每个都有2个分别用于发送和接收的8位移位寄存器。一次SPI传输期间,同时发送(串行移出)和接收(串行移入)数据。由相应控制寄存器设置指定8位串行数据的频率。如果只希望发送,则接收数据可以保持伪位(dummy)。此外如果只希望接收,则需要发送伪位'1'数据

    使用SPI主要需要以下寄存器


    选择SPI模式,中断模式,查询模式等SCK选择,主从机选择以及GPOL GPOA选择,关于GPOLGPOA的描述请查看SPI协议手册


    选择SPI时钟,SPI挂在PCLK,具体计算公式如下


    针对数据传输完成之后的SPI总线状态做一个选择


    传输数据时,数据分别存在与两个寄存器中


    同时,在传输过程中查看是否发送完成或者接收完成应该看这个寄存器


    另外,SPI通讯过程中如果希望只写不读,应该发送0XFF,这样才能产生SPI时钟

     

    示例代码如下

    SPI.C

    #include "spi.h"
    
    
    void SPI0IoInit(void)
    {
        // SPI0为主设备
        // 初始化GPE GPE11:MISO0(MISO);GPE12:MOSI0(MOSI);GPE13:SPICLK0(SCK)
        //对三个引脚的的配置清零
        rGPECON &= ~((3<<26)|(3<<24)|(3<<22));
        //配置为第二功能
        rGPGCON |= ((2<<26)|(2<<24)|(2<<22));
    }
    
    void SPI0Init(void)
    {
        SPI0IoInit();
        // 设置时钟控制寄存器(CLKCON),使能SPI时钟
        //rCLKCON = (rCLKCON & ~(1 << 18)) | (1 << 18);
        // 设置波特率预定标器寄存器(SPPREn),波特率 = PCLK / 2 / (预定标器值 + 1) 
        //预订频率为1M
        rSPPRE0 = (PCLK/2/1000000) - 1;
        // 设置SPCONn寄存器以正确配置SPI模块
        // normal; format A; active high; master; enable; polling mode
        rSPCON0 &= ~(0x7f);     //清零
        //时钟使能 主机模式  查询模式 低电平有效 格式A 普通模式
        rSPCON0 |= ((1<<4)|(1<<3));
        // 设置SPI引脚控制寄存器(SPPINn)
        // 禁止多主机模式,发送完成释放MOSI
        rSPPIN0 &= ~((1<<2)|(1<<0));
    }
    
    u8 SPI0RWData(u8 dat)
    {
        u8 retry=0;
        u8 temp = 0;
        while (!(rSPSTA0 & 0x01)) //等待数据传输就绪
        {
            retry++;
    		if(retry>200)return 0;
        }
        rSPTDAT0 = dat; //传输数据
        while (!(rSPSTA0 & 0x01)) //等待数据传输就绪
        {
            retry++;
    		if(retry>200)return 0;
        }
        temp = rSPRDAT0;
        return temp;
    }
    
    



    SPI.H

     

    #ifndef __SPI_H
    #define __SPI_H
    #include "2440addr.h"
    #include "def.h"
    #include "clock.h"
    
    void SPI0IoInit(void);
    void SPI0Init(void);
    u8 SPI0RWData(u8 dat);
    
    
    
    
    
    #endif
    
    
    
    


  • 相关阅读:
    Keepalived案例一:Keepalived双机热备(HA)精讲
    Linux服务器挂载ntfs移动硬盘
    RAC 单节点实例异常关闭,关键报错ORA--29770
    模拟等待事件:db file sequential read
    使用dbms_stats.gather_table_stats调整表的统计信息
    oracle rac常用的网络检查命令
    收集Oracle数据库中的SQL基线信息(一)基础信息收集
    Oracle 通过sql profile为sql语句加hint
    将指定SQL的执行计划从共享池删除的方法
    数据库什么时候建立索引?
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4279416.html
Copyright © 2011-2022 走看看