现在的位置: 首页 > 综合 > 正文

S3C2410 SPI在win ce下的编程(1)

2012年11月14日 ⁄ 综合 ⁄ 共 3444字 ⁄ 字号 评论关闭

去年的时候调了一下2410的SPI,很晕,但最后还是通了,今天简单记录一下大概的过程。 

按着我的惯例先引用一段网络上的文章来预热一下。

引用:

概况:

S3C2410X的连续外围设备接口(SPI)能连接电路实现连续数据传递。S3C2410X包含2个SPI,,每个都分别有两个8位转移寄存器用于数据的传输和接收。在一个SPI进行数据传递时,同步传送数据并连续输出数据。在某一频率的8位连续数据由它相应的通讯控制寄存器设置所决定。假如你只发送数据,接收数据就能设为哑元。反之,如果你只想接收数据,你应该发送设为哑元'1'数据。

S3C2410有4个与SPI传输有关的I/O信号引脚:SCK(SPICLK0,1)、MISO(SPIMISOO,1)数据线,MOSI(SPIMOSIO,1)和低电平有效的/SS(nSS0,1)引脚(输入)。

特点

与SPI协议(Ver.2.11)兼容

8位移位寄存器输出

8位移位寄存器接收

8位预分频逻辑

查询,中断,DMA传输模式

 
SPI操作

采用SPI接口, S3C2410X可发送/接收与外部设备同步的8位数据。一个串行时钟线与两条用来移位和采样信息的数据线同步。 当SPI为主机时,发送频率可以通过为SPPREn寄存器设置合适的值来控制。你可以通过调整波特率数据寄存器的值来修改它的频率。当SPI为从机时,其它的主机提供时钟。当编程者向SPTDATn寄存器写字节数据时,SPI的收/发将会同时开始。在其它情况下,在向SPTDATn寄存器写入字节数据时要把nSS激活。

编辑程序

当向SPTDATn寄存器写入字节时,如果ENSCK和SPCONn被设置的话,SPI就开始传输

你可以使用一上典型的程序来操作一个SPI卡。

编程SPI模式,基本遵循这些基本步骤:

1.       设置波特率寄存器(SPPREn)

2.       设置SPCONn以选择合适的SPI模式。

3.        写数据0xFF到SPTDATn10次以初始化MMC或SD卡。.

4.       设置GPIO引脚使其具有nSS功能,低电平时使MMC或SD卡有效。

5.       发送数据:检查发送准备樗是否为1,如果为1 的话就开始向SPTDATn写数据。

6.       接收数据(1):SPCONn的 TAGD 位禁用 = 正常模式

    :向SPTDATn 写0xFF,然后测试REDY,再从读缓存中读取数据。

7.       接收数据:SPCONn的TAGD位 能用 = 自动接收垃圾数据模式。

    :测试REDY,然后从读缓存中读取数据。

8.       设置GPIO引脚使其具有nSS功能,高电平时使MMC或SD卡有效。

通过DMA发送的步骤

1.       SPI的配置为DMA模式

2.       DMA合适设置

3.       SPI请求DMA服务

4.       DMA向SPI发送一个字节数据.

5.        SPI向卡里发送数据

6.       返回到步骤3直到DAM计数变为0

7.       用SMOD位把SPI设置为中断或查询模式

 
通过DMA接收的步骤

1.       把SPI设置为DMA以SMOD位开始,并且设置TAGD位.

2.       全适配置 DMA

3.       SPI从卡里接收一字节数据

4.       SPI请求DMA服务

5.       DMA从SPI接收数据

6.        自动的向SPIDATn写数据0xFF

7.        回到步骤4至DAM计数变为0

8.       用SMOD位把SPI配置为查询模式,并且清TAGD位

9.       如果SPSTAn的REDY 标志被设置,就读取最后的字节数据

 
注:

总接收的数据 = DAM TC 值+在查询模式下的最后值.

DAM接收的第一个数据是哑元,所以使用者可以忽略它

SPI 从机接收模式和B模块

 
如果SPI从机接收模式有效和SPI模块被设成B模块,SPI操作将会失败。

READY信号这一内部信号将在SPI_CNT达到0之前变成高电平。因此,在DMA模式中,DATA_READ信号应该在最后一个数据结束之前产生。

注意

1)      DMA模式:这种模式不能在SPI从机接收模式和B模块下使用。

2)      查询模式:在SPI从机接收模式和B模块下DATA_READ信号应该推迟SPICLK的一个相位。

3)      中断模式:在SPI从机接收模式和B模块下DATA_READ信号应该推迟SPICLK的一个相位。

SPI特殊寄存器

SPI控制寄存器

SPI状态寄存器

SPI引脚控制寄存器

如果SPI系统使能时,除nSS引脚外的其它引脚的方向通过SPCONn的MSTR位来控制。nSS引脚的方向总是输入。

当SPI为主机时,nSS引脚用来检查由SPPIN的ENMUL位提供的多主机错误信号,另一个GPIO应该选择从机。

如果SPI被设置为从机,nSS引脚奖被一个主机选择为从机。

SPIMISO和SPIMOSI数据引脚用来发送和接收串行数据。当SPI为主机时,SPIMISO是数据输入引脚,SPIMOSI是数据输出引脚,SPICLK(SCK)是时钟输出线。当SPI为从机时,这些引脚执行相反的功能。在多主机系统中,SPICLK(SCK)、SPIMOSI、SPIMISO将被分别的配置在一个体系中。

当其它的SPI设备作为从机选择S3C2410 的SPI为从机时,一个主机SPI可以发出一个多主机错误信号。当这个信号被探测到,将会立刻发生下面所说的事情。但是如果你想探测到这种信号的话必须事先设置SPPINn的ENMUL位。

 
1.       SPCONn的MSTR位被强制为0来启动从机模式。

2.       SPSTAn的MULF标志位被置位,一个SPI中断会产生。

 

 

这个是我从网上搜到的一篇可以说是2410datasheet    SPI部分简单翻译的文章,不过感觉不是很好,最好是过完一遍后再去读英文的文档,那个才是“根本”,才能看得懂,看得明白。

不过下面还是比出一个比较好的文章,介绍得很全。其中有臭氧层子的东西,也有寄存器的介绍,这样设置起来也比较容易,毕竟最干的、最实际的、最精华的地方还是在这里嘛。如下:

SPI接口概述

 SPI接口:SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司开发的一种同步串行外设接口标准。
 SPI接口信号:有4个信号:数据发送、数据接收、时钟和片选。在时钟信号的作用下,发送的同时,接收对方发来的数据;也可以只发送、或者只接收。SPI的波特率可以达到20Mb/s以上。
  S3C2410 ARM9有2个SPI接口,既可以作为主SPI使用,也可以作为从SPI使用。
 主要特点:
 与SPI 协议 (ver. 2.11) 兼容;
 8位发送移位寄存器;
 8位接收移位寄存器;
 8位预分频器;
 具有查询、中断、DMA传输模式。

   

SPI工作时序 个人认为这个还是比较重要地!!!
 
时序图就不发了, 这个是根据时序图总结的一个表,很有意义 

Format
CPOLCPHA
第一位数据输出
其它位数据输
数据采样
A
CPOL=0,CPHA=0
1SCK上升沿
SCK下降沿
SCK上升沿
B
CPOL=0,CPHA=1
1SCK上升沿
SCK上升沿
SCK下降沿
A
CPOL=1,CPHA=0
1SCK下降沿
SCK上升沿
SCK下降沿
B
CPOL=1,CPHA=1
1SCK下降沿
SCK下降沿
SCK上升沿

 

Register
Address
R/W
Description
Reset Value
SPCONn
0x590000x0
R/W
SPI控制寄存器
0x00
SPSTAn
0x590000x4
R
SPI状态寄存器
0x01
SPPINn
0x590000x8
R/W
SPI引脚控制寄存器
0x02
SPPREn
0x590000xC
R/W
SPI预分频寄存器
0x00
SPTDATn
0x590000x0
R/W
SPI数据发送寄存器
0x00
SPRDATn
0x590000x4
R
SPI数据接收寄存器
0x00

1SPI控制寄存器(SPCON
 

Register
Address
R/W
Description
Reset Value
SPCON0
0x59000000
R/W
SPI0 控制寄存器
0x00
SPCON1
0x59000020
R/W
SPI1 控制寄存器
0x00

 

字段名
   
初值
SMOD
6:5
 SPI模式选择。00:查询模式;
 01:中断; 10DMA模式; 11:保留
00
ENSCK
4
 时钟SCK控制。  0:禁止

抱歉!评论已关闭.