NIOS II SPI详解 如何使用SPI方式传输文档格式.docx
- 文档编号:22520240
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:7
- 大小:17.77KB
NIOS II SPI详解 如何使用SPI方式传输文档格式.docx
《NIOS II SPI详解 如何使用SPI方式传输文档格式.docx》由会员分享,可在线阅读,更多相关《NIOS II SPI详解 如何使用SPI方式传输文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
发送逻辑包含发送保持寄存器(txdata)和发送移位寄存器,各有n位宽度,可配置1~32位。
当某主外设写txdata,值会自动被复制到移位寄存器,并在下个操作开始时传输。
Txdata和移位寄存器提供两个存储空间。
当有数据在移位寄存器传输时,可以往txdata中写入数据,并且在移位寄存器处理完当前数据时会自动加载txdata中数据,并发送。
在主设备模式传输移位寄存器直接驱动mosi,在从设备模式,传输移位寄存器直接驱动miso。
数据传输时,LSB或者MSB在前,由配置时用户指定。
指定之后,不可软件更改。
4、接收逻辑
接收逻辑包含接收保持寄存器(rxdata)和接收移位寄存器,各有n位宽度,可配置1~16位。
在接收移位寄存器捕获满n位数据后,主外设可以从rxdata中读取接收到的数据。
同发送逻辑类似,接收逻辑同样具有提供两个存储空间的功能。
Rxdata可以保持前一个接收到的数据,同时接收移位寄存器亦在接收数据。
当一个传输完毕时,接收逻辑自动将接收移位寄存器的数据更新至rxdata。
在主设备模数时,接收移位寄存器直接受miso驱动。
在从设备模式
,受mosi驱动。
同样,数据传输时,LSB或者MSB在前,由配置时用户指定。
5、在SOPC中安装SPI-CORE
5.1
主从设置
用户可以选择主设备模式或者从设备模式。
当选择主设备模式时,下面的选择是有效的:
Numberofselect(SS_n)signals、SPIclockrate、
和Specifydelay.
(1)NumberofSelect(SS_n)Signals
设置从设备的个数。
取值范围是1~32。
该选择会在生成NIOSII时产生n个SS_n引脚,用于片选。
(2)SPIClock(sclk)Rate
该时钟是有Avalon-MM分频产生,其数学关系是:
<
Avalon-MMsystemclockfrequency>
/[2,4,6,8,...]
在SOPC设置时,可以输入所需要的时钟,软件会自动选择一个低于或者等于所输入时钟的最近符合值。
时钟的设置注意结合从设备的要求。
(3)SpecifyDelay
该延时是指片选信号有效(置低)之后,需要多长的时间才能对从设备发起操作。
5.2
数据寄存器设置
该设置影响数据寄存器的大小和行为特性。
(1)Width—设置txdata、rxdata、发送移位寄存器、接收移位寄存器的大小,可设置为1~32位。
(2)Shiftdirection—指定数据传输时LSB或者MSB在前。
用户需了解从设备所需的模式。
5.3
时序设定
该设定涉及ss_n,
sclk,
mosi
和
miso
信号的设置。
共有两处设定,可设定4种模式。
(1)Clockpolarity—设置为0时,sclk空闲时为低;
设置为1时,sclk空闲时为高。
(2)Clockphase—设置为0时,数据在sclk的上升沿锁存;
设置为1时,数据在sclk的下降沿锁存。
具体见如下时序图:
1.
ClockPolarity=0,ClockPhase=0
2.
ClockPolarity=0,ClockPhase=1
3.
ClockPolarity=1,ClockPhase=0
4.
ClockPolarity=1,ClockPhase=1
6、NIOSII软件驱动模块
有两种方式:
使用有Altera提供的alt_avalon_spi_command()函数,使用非常简单。
具体可见笔者下一篇驱动实例。
2.
读者自己编写。
这里先将读者自己DIY的驱动编写方法。
6.1
驱动方式一
必须包含:
#include
"
altera_avalon_spi.h"
altera_avalon_pio_regs.h"
这两个头文件。
文件中包含有寄存器地址与API函数。
IOWR_ALTERA_AVALON_SPI_SLAVE_SEL();
//从设备选择
IOWR_ALTERA_AVALON_SPI_CONTROL(base,data);
//控制寄存器
IORD_ALTERA_AVALON_SPI_RXDATA(base);
//读接收寄存器
IOWR_ALTERA_AVALON_SPI_TXDATA(base,data);
//写发送寄存器
IORD_ALTERA_AVALON_SPI_STATUS(base);
//读状态寄存器
为了准确实现方式,首先列出SPI寄存器映射图
(1)若rxdata和txdata少于16位,则[31:
16]位无效;
(2)写status会清除ROE、TOE和E位;
(3)ss0只在作为主设备时有效;
用来启动发送或者接受数据。
例如:
4)rxdata:
//
ForceSS_nactive:
na_spi_0->
np_spicontrol
|=
np_spicontrol_sso_mask;
for
(i
=
0;
i
3;
++i)
{
Transmitabyte:
while
(!
(na_spi_0->
np_spistatus
&
np_spistatus_trdy_mask));
np_spitxdata
data[i];
Readandthrowawaythereceiveddata:
np_spistatus_rrdy_mask));
np_spirxdata;
}
Waituntilthelastbyteistransmitted:
np_spistatus_tmt_mask));
ReleaseSS_n:
=~np_spicontrol_sso_mask;
(
(a)当接收寄存器接收到所设置的n位且将数据移入rxdata后,status中的RRDY设为1;
软件可设查询此位来判断是否有新数据接收。
如:
while(IORD_ALTERA_AVALON_SPI_STATUS(base)&
ALTERA_AVALON_SPI_STATUS_RRDY_MSK==1);
(b)读rxdata会自动清除RRDY位;
(c)新数据总是不断读入rxdata,若RRDY=1;
rxdata的数据未读出时,有新的数据传入rxdata,则ROE=1;
此时,rxdata存储的数据未定义。
(5)txdata:
(a)当TRDY=1时,表示发送寄存器准备好接受下一个发送数据。
ALTERA_AVALON_SPI_STATUS_TRDY_MSK==1);
(b)写入rxdata使TRDY=0;
(c)当txdata中的数据传入发送寄存器时,TRDY=1;
(d)若TRDY=0时写入数据至txdata会导致TOE=1;
此时新数据被忽略。
6.2驱动方式二
该方式使用官方的函数:
(下篇文章使用的是该方式。
)
intalt_avalon_spi_command(alt_u32base,alt_u32slave,
alt_u32write_length,
constalt_u8*wdata,
alt_u32read_length,
alt_u8*read_data,
alt_u32flags)
该函数不支持8位或者8位以上的传输。
但是,可以调用多次实现高于8位的传输。
该函数源码位于“<
安装路径>
/altera/81/ip/altera/sopc_builder_ip/altera_avalon_spi/HAL/src”。
alt_u32base,alt_u32slave,
//选择从设备
alt_u32write_length,//设置写入长度。
8位为一个长度。
constalt_u8*wdata,
//将要写入数据的数组地址。
该函数自动将数组中的数据依次发出直到发出所设定的write_length长度。
alt_u32read_length,
//设置读出长度。
8位为一个长度
alt_u8*read_data,
//将读出的数据存储到数组中,直到存满所设定的read_length长度
alt_u32flags,
//如果flag=ALT_AVALON_SPI_COMMAND_MERGE,则访问完从设备之后不会释放从设备,一般用于需多次访问的情况。
如果flag=0,则每次访问完从设备都会释放从设备,即当读取read_length个字节数,或者写完write_length个字节数,会释放从设备。
7、总结
笔者测试使用环境均为8.1版本。
使用器件为CYCLONEIIEP2C8Q208C8N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NIOS II SPI详解 如何使用SPI方式传输 SPI 详解 如何 使用 方式 传输