S3C6410 SPI全双工读写流程分析

发布者:DreamySunset最新更新时间:2024-09-18 来源: cnblogs关键字:S3C6410  SPI  全双工 手机看文章 扫描二维码
随时随地手机看文章

S3C6410 SPI全双工读写流程分析


一、SPI控制器datasheet


1详细请参考:http://blog.csdn.net/hustyangju/article/details/20474659


2 SPI的所有寄存器都是映射到内核空间的,采用基地址+偏移地址的方式访问


static volatile void  __iomem *spiregs;                            //global variable for mapping spiregister


spiregs = (volatile)ioremap(0x7F00B000,0x30);  //just request for the spi0


3 下文可能用到的偏移地址

#define S3C_CH_CFG                (0x00)     //SPI configuration  

#define S3C_CLK_CFG               (0x04)      //Clock configuration  

#define S3C_MODE_CFG                   (0x08)     //SPI FIFO control  

#define S3C_SLAVE_SEL            (0x0C)      //Slave selection  

#define S3C_SPI_INT_EN                   (0x10)      //SPI interrupt enable  

#define S3C_SPI_STATUS          (0x14)      //SPI status  

#define S3C_SPI_TX_DATA                (0x18)      //SPI TX data  

#define S3C_SPI_RX_DATA                (0x1C)      //SPI RX data  

#define S3C_PACKET_CNT                (0x20)      //count how many data master gets  

#define S3C_PENDING_CLR             (0x24)      //Pending clear  

#define S3C_SWAP_CFG           (0x28)      //SWAPconfig register  

#define S3C_FB_CLK                  (0x28)     //SWAP FB config register  

   

   

#define SPI_CH_SW_RST                   (1<<5)  

#define SPI_CH_MASTER                  (0<<4)  

#define SPI_CH_SLAVE              (1<<4)  

#define SPI_CH_RISING            (0<<3)  

#define SPI_CH_FALLING                   (1<<3)  

#define SPI_CH_FORMAT_A             (0<<2)  

#define SPI_CH_FORMAT_B             (1<<2)  

#define SPI_CH_RXCH_OFF              (0<<1)  

#define SPI_CH_RXCH_ON               (1<<1)  

#define SPI_CH_TXCH_OFF               (0<<0)  

#define SPI_CH_TXCH_ON                (1<<0)  

   

#define SPI_CLKSEL_PCLK                 (0<<9)  

#define SPI_CLKSEL_USBCLK   (1<<9)  

#define SPI_CLKSEL_ECLK                 (2<<9)  

#define SPI_ENCLK_DISABLE  (0<<8)  

#define SPI_ENCLK_ENABLE   (1<<8)  

   

#define SPI_MODE_CH_TSZ_BYTE (0<<29)  

#define SPI_MODE_CH_TSZ_HALFWORD       (1<<29)  

#define SPI_MODE_CH_TSZ_WORD       (2<<29)  

#define SPI_MODE_BUS_TSZ_BYTE        (0<<17)  

#define SPI_MODE_BUS_TSZ_HALFWORD     (1<<17)  

#define SPI_MODE_BUS_TSZ_WORD     (2<<17)  

#define SPI_MODE_RXDMA_OFF    (0<<2)  

#define SPI_MODE_RXDMA_ON     (1<<2)  

#define SPI_MODE_TXDMA_OFF    (0<<1)  

#define SPI_MODE_TXDMA_ON     (1<<1)  

#define SPI_MODE_SINGLE              (0<<0)  

#define SPI_MODE_4BURST             (1<<0)  

   

#define SPI_SLAVE_MAN                   (0<<1)  

#define SPI_SLAVE_AUTO                  (1<<1)  

#define SPI_SLAVE_SIG_ACT   (0<<0)  

#define SPI_SLAVE_SIG_INACT        (1<<0)  

   

#define SPI_INT_TRAILING_DIS      (0<<6)  

#define SPI_INT_TRAILING_EN       (1<<6)  

#define SPI_INT_RX_OVERRUN_DIS       (0<<5)  

#define SPI_INT_RX_OVERRUN_EN        (1<<5)  

#define SPI_INT_RX_UNDERRUN_DIS    (0<<4)  

#define SPI_INT_RX_UNDERRUN_EN     (1<<4)  

#define SPI_INT_TX_OVERRUN_DIS        (0<<3)  

#define SPI_INT_TX_OVERRUN_EN         (1<<3)  

#define SPI_INT_TX_UNDERRUN_DIS    (0<<2)  

#define SPI_INT_TX_UNDERRUN_EN     (1<<2)  

#define SPI_INT_RX_FIFORDY_DIS (0<<1)  

#define SPI_INT_RX_FIFORDY_EN  (1<<1)  

#define SPI_INT_TX_FIFORDY_DIS (0<<0)  

#define SPI_INT_TX_FIFORDY_EN  (1<<0)  

   

#define SPI_STUS_TX_DONE   (1<<21)  

#define SPI_STUS_TRAILCNT_ZERO        (1<<20)  

#define SPI_STUS_RX_OVERRUN_ERR   (1<<5)  

#define SPI_STUS_RX_UNDERRUN_ERR         (1<<4)  

#define SPI_STUS_TX_OVERRUN_ERR    (1<<3)  

#define SPI_STUS_TX_UNDERRUN_ERR          (1<<2)  

#define SPI_STUS_RX_FIFORDY       (1<<1)  

#define SPI_STUS_TX_FIFORDY       (1<<0)  

   

#define SPI_PACKET_CNT_DIS         (0<<16)  

#define SPI_PACKET_CNT_EN (1<<16)  


二、重点参数及初始化步骤


1 双通道SPI管脚配置



2 传输模型配置

/*     Set transfer type (CPOL & CPHA set)    */

         spi_chcfg= SPI_CH_RISING | SPI_CH_FORMAT_A;

         spi_chcfg|= SPI_CH_MASTER;

         writel(spi_chcfg , spiregs + S3C_CH_CFG);

详细请参考:http://blog.csdn.net/hustyangju/article/details/20474659

3 时钟配置


使用PCLK,外部时钟66M,100分屏:

 

/*     Set clock configuration register    

        *       SPIclockout = clock source / (2 * (prescaler +1))    

         *       PCLK=66Mhz, SPI clockout = clock source /(2 * (prescaler +1))      */

         spi_clkcfg= SPI_ENCLK_ENABLE;

         spi_clkcfg|= SPI_CLKSEL_PCLK;

         writel(spi_clkcfg , spiregs + S3C_CLK_CFG);

         spi_clkcfg= readl( spiregs + S3C_CLK_CFG);

 

         spi_clkcfg|= 49;       // the least spi speed =660Khz

         writel(spi_clkcfg , spiregs + S3C_CLK_CFG);

4 SPI 模块设置


/*     Set SPI MODE configuration register    */

         spi_modecfg= SPI_MODE_CH_TSZ_BYTE| SPI_MODE_BUS_TSZ_BYTE;

         spi_modecfg|= SPI_MODE_TXDMA_OFF| SPI_MODE_SINGLE| SPI_MODE_RXDMA_OFF;

         spi_modecfg&= ~( 0x3f << 5);

         spi_modecfg|= ( 0x1 << 5);    // Tx FIFOtrigger level in INT mode

         spi_modecfg&= ~( 0x3f << 11);

         spi_modecfg|= ( 0x1 << 11);           // Rx FIFOtrigger level in INT mode

         spi_modecfg&= ~( 0x3ff << 19);     

         spi_modecfg|= ( 0x1 << 19);   // Counting ofTailing Bytes

 

         writel(spi_modecfg,spiregs + S3C_MODE_CFG);

 

设置在fifo和bus中的数据宽度为byte,关闭DMA访问fifo,并设置fifo中保存最大字节数为1,设置接收和发送fifo的触发值为1byte。

5 中断配置


/*     SetSPI INT_EN register   */

         writel(spi_inten,spiregs + S3C_SPI_INT_EN); //u32 spi_inten =0x00

         writel(0x1f,spiregs + S3C_PENDING_CLR);

6 设置最大接收数据包数量

SPI can control the number of packets to bereceived in master mode. If there is any number of packets to bereceived, justset the SFR (Packet_Count_reg). SPI stops generating SPICLK when the number ofpackets is thesame as what you set. It is mandatory to follow software orhardware reset before this function is reloaded.(Software reset can clear allregisters except special function registers, but hardware reset clears allregisters.)

[1] [2]
关键字:S3C6410  SPI  全双工 引用地址:S3C6410 SPI全双工读写流程分析

上一篇:ARM程序剖析--ARM程序结构,Image文件结构等
下一篇:qt-embedded-linux-opensource-src-4.5.3移植到s3c6410

推荐阅读最新更新时间:2024-11-16 10:14

s3c6410时钟初始化
今天自己写bootloader做时钟初始化时遇到的问题,特记录下来。为了方便理解,我大部分都有截图, 在此我先说明下,图均来自数据手冊。也希望看了本篇文章的同志多多參看数据手冊才干理解的更加透彻,才干真正的锻炼自己的能力。以下程序部分我也拆分成了5个部分分别解释,最后也给出了整个程序。本文假设有什么错误的地方。欢迎各位批评指正。不甚感激。 6410有3个内部PLL(Phase Locked Loop:为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术。 很多电子设备要正常工作,通常须要外部的输入信号与内部的振荡信号同步。利 用锁相环路就能够实现这个目的。 各自是:APLL
[单片机]
<font color='red'>s3c6410</font>时钟初始化
STM32F103标准库开发---SPI实验---底层驱动程序
一、SPI 实验----I/O端口配置 在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。 具体引脚配置如下: 具体引脚初始化程序如下: /* SPI引脚初始化配置 **PA4------CS **PA5------SCLK **PA6------MISO **PA7------MOSI */ void SPI1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );/
[单片机]
STM32F103标准库开发---<font color='red'>SPI</font>实验---底层驱动程序
通过SPI方式实现LPC17xx的远程升级设计
一、设计方案简介 本方案基于NXP的LPC1768微处理器为平台,使用KEIL MDK4.70A为开发工具,通过SPI的方式实现程序的自动更新。 本方案程序由bootloader、低区用户程序,高区用户程序三部分组成。Bootloader实现程序的跳转及IAP程序的烧写。低区程序位于LPC1768的0x1000~0x2FFFF处,高区程序位于LPC1768的0x30000~0x67FFFF处。 待更新的程序放置于外部存储芯片N25Q256的0x00100000处,并占据48个扇区。LPC1768的bootloader通过SPI的方式读取N25Q256的数据并更新程序至高区用户程序,更新成功后,程序复位,运行更新后的程序
[单片机]
通过<font color='red'>SPI</font>方式实现LPC17xx的远程升级设计
STM32 SPI基础内容
SPI,全称为 Serial Peripheral Interface(串行外设接口),是一种用于短距离通信的同步串行通信接口,主要应用在嵌入式系统。 SPI的应用场合很广,显示模组、时钟芯片、存储芯片、温度传感器等众多器件都有使用SPI接口通信。 这些器件通常作为从设备,单片机作为主设备来控制它们,今天就结合STM32来分析一下SPI常见通信有异常的问题。 STM32 SPI基础内容 绝大部分STM32芯片都有多个SPI外设,它可与外部SPI器件进行半双工/全双工同步串行通信。 1. SPI特性 三条线全双工、双线单工同步传输 支持 8 位或 16 位传输帧格式选择 支持主模式或从模式操作 可编程的时钟极性和相位 支持 MS
[单片机]
STM32 <font color='red'>SPI</font>基础内容
STM8 SPI从模式
STM8 SPI从模式 在从配置里,SCK引脚用于接收到从主设备来的串行时钟。SPI_CR1寄存器中BR 的设置不影响数据传输速率。 置配步骤 1.选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系(见图91)。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。 2.帧格式(MSB在前还是LSB在前取决于SPI_CR1寄存器中的LSBFIRST位)必须和主设备相同。 3.在使用硬件模式(参考从选择(NSS)脚管理部分)时,NSS引脚在字节传输的全部过程中都必须为低电平。在使用件模式时,设置SPI_CR2寄存器中的SSM位并清除SSI位。 4.清除MSTR位,设置SPE位,使相应引脚工作
[单片机]
STM8 <font color='red'>SPI</font>从模式
S3C6410(Real6410) Linux 6x6矩阵键盘驱动移植
Real6410默认的键盘驱动是gpio键盘驱动,现在要取消gpio键盘,实现矩阵键盘。6410的矩阵键盘驱动对应的是samsung-keypad.c,位于driver/input/keyboard目录,可按照下面步骤进行移植。 1、 在arch/arm/mach-s3c64xx/mach-real6410.c中签加 添加头文件: #include plat/keypad.h 添加struct定义 static uint32_t smdk6410_keymap __initdata = { /* KEY(row, col, keycode) */ /*S00(0,0), S01(0,1),
[单片机]
MSP430G2553 HC595 数码管 SPI 显示 时分秒
// Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void) { t_count = (t_count + 1) % 500; //500次2ms就是1s if (t_count == 1) { rtc_sec++; if (rtc_sec == 60) { rtc_sec = 0; rtc_min++; if (rtc_min == 60) { rtc_min = 0;
[单片机]
MSP430G2553 HC595 数码管 <font color='red'>SPI</font> 显示 时分秒
SPI接口的工作原理及优缺点分析
  SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用。   1. 接口   SPI接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。如图1所示,其使用的4条信号线分别为:   1) SCLK:串行时钟,用来同步数据传输,由主机输出;   2) MOSI:主机输出从机输入数据线;   3) MISO:主机输入从机输出数据线;   4) SS:片选线,低电平有效,由主机输出。   在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三
[嵌入式]
<font color='red'>SPI</font>接口的工作原理及优缺点分析
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved