zoukankan      html  css  js  c++  java
  • SPI设计


    title: SPI设计
    tags: ARM
    date: 2018-11-05 15:22:59

    SPI设计

    概述

    在SPI协议中,有两个值来确定SPI的模式。 CPOL:表示SPICLK的初始电平,0为电平,1为高电平 CPHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿.

    CPOL CPHA 模式 含义
    0 0 0 初始电平为低电平,在第一个时钟沿采样数据
    0 1 1 初始电平为低电平,在第二个时钟沿采样数据
    1 0 2 初始电平为高电平,在第一个时钟沿采样数据
    1 1 3 初始电平为高电平,在第二个时钟沿采样数据

    常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。比如下图的flash手册

    mark

    寄存器配置

    1. GPIO复用为SPI
    2. 设置SPI寄存器
      1. 设置波特率预分频寄存器(SPPREn)
      2. 设置 SPCONn 来正确配制 SPI 模型
      3. 写数据 0xFF 到 SPTDATn 10 次来初始化 MMC 或 SD 卡
      4. 设置起 nSS 作用的 GPIO 引脚为低来激活 MMC 或 SD 卡
      5. 发送数据 ¡ 检查发送就绪标志的状态(REDY = 1),并接着写数据到 SPTDATn。
      6. 接收数据(1):SPCONn 的 TAGD 位禁止 = 普通模式
      7. ¡ 写 0xFF 到 SPTDATn,然后确认 REDY 的置位,并接着从读缓冲器读取数据
      8. 接收数据(2):SPCONn 的 TAGD 位使能 = 自动发送杂数据模式
      9. ¡ 确认 REDY 的置位,并接着从读缓冲器读取数据(然后自动开始传输)
      10. 设置起 nSS 作用的 GPIO 引脚为高来释放 MMC 或 SD 卡

    程序设计

    /*
    [6:5]设置为查询模式: 00 polling mode
    [4]设置时钟使能: 1 = enable 
    [3]设置为主机模式: 1 = master
    [2]设置无数据时时钟为低电平: 0
    [1]设置工作模式为模式A: 0 = format A
    [0]设置发送数据时无需读取数据: 0 = normal mode
    */
    static void SPIControllerInit(void)
    {
        /* OLED  : 100ns, 10MHz
        * FLASH : 104MHz
        * 取10MHz
        * 10 = 50 / 2 / (Prescaler value + 1)
        * Prescaler value = 1.5 = 2
        * Baud rate = 50/2/3=8.3MHz
        */
        SPPRE0 = 2;
        SPPRE1 = 2;
    
        /* [6:5] : 00, polling mode
        * [4]   : 1 = enable 
        * [3]   : 1 = master
        * [2]   : 0
        * [1]   : 0 = format A
        * [0]   : 0 = normal mode
        */
        SPCON0 = (1<<4) | (1<<3);
        SPCON1 = (1<<4) | (1<<3);
        
    }
    
    

    发送接收(查询)

    mark

    void SPISendByte(unsigned char val)
    {
        while (!(SPSTA1 & 1));
        SPTDAT1 = val;    
    }
    //读数据的时候,无所谓发什么数据
    unsigned char SPIRecvByte(void)
    {
        SPTDAT1 = 0xff;    
        while (!(SPSTA1 & 1));
        return SPRDAT1;    
    }
    
  • 相关阅读:
    VB6 获取和设置默认打印机
    VB操作EXCEL文件大全
    VB常用字符串操作函数
    VB数组的清除
    清理系统内存
    转:清理系统垃圾的BAT代码
    对Kalman(卡尔曼)滤波器的理解
    Kernel Memory Layout on ARM Linux
    linux kernel内存映射实例分析
    基于ARM的模拟器
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023646.html
Copyright © 2011-2022 走看看