英创信息技术EM9170 SPI接口用户指南简介

1、功能描述
em9170提供了一路硬件4线制spi接口供用户使用,它的4条信号线与系统的gpio复用,系统上电后,对应管脚默认为gpio状态(详见《em9170工控主板数据手册 》),当在应用程序中打开spi接口后,对应的信号线将自动切换到spi状态。em9170 spi接口支持以下特性:
· 4线制全双工同步串行接口
· 主控(master)工作模式
· 可以配置spi时钟信号(spi_sclk)的相位和极性
· 支持1至32-bit可配置的数据通讯位宽
· 支持dma操作方式
· 最高波特率16mbps
spi通讯的时序简单,主要是在spi时钟(sclk)的同步下,在两个设备的移位寄存器间进行数据通讯。em9170的spi接口可以配置sclk的极性(pol)和相位(pha),图1为设置不同的相位和极性配置时,时钟信号的输出波形。
图1:spi总线sclk和mosi,miso之间的关系
图1中的时钟极性(pol)决定了spi串行时钟信号线(sclk)空闲时的电平,如果pol=0,串行时钟空闲时为低电平,pol=1串行时钟空闲时为高电平。时钟相位(pha) 用来决定数据在什么时刻输出和锁存输入。如果 pha=0,spi控制器在sclk的下降沿输出数据,在sclk上升沿锁存输入的数据。当pha=1时,将在sclk上升沿输出数据,而在sclk下降沿锁存输入数据。spi线上的主从设备必须根据具体情况设置匹配的传输时序模式,时序只有匹配,数据才能正常通讯。
2、操作说明
2.1 打开spi端口
通过调用createfile( )函数来打开系统的spi设备,设备名称为“spi1:”如下所示:
// open the spi port.
hspi = createfile (text”spi1:”, // name of device
generic_read | generic_write, // access (read-write) mode
file_share_read | file_share_write, // sharing mode
null, // security attributes (ignored)
open_existing, // creation disposition
file_flag_random_access, // flags/attributes
null); // template file (ignored)
2.2 数据通讯
在进行spi数据通讯前,需要调用spiconfig()函数对spi总线做相应的配置,函数申明如下:
bool spiconfig( handle hcspi, pcspi_busconfig_t pcspiconfig );
其中参数pcspiconfig为spi总线配置结构体,其定义如下:
typedef struct
{ // cspi bus configuration
uint32 freq; // spi波特率:<=16mbps
uint8 bitcount; // 数据位宽:1~32bit
bool pol; // 设置时钟极性
bool pha; // 设置时钟相位
} cspi_busconfig_t, *pcspi_busconfig_t;
用户调用spiexchange()函数来完成一次数据收发,函数申明如下:
bool spiexchange(
handle hcspi, // 由createfile创建的handle
pvoid ptxbuf, // 发送数据缓存
pvoid prxbuf, // 接收数据缓存
uint32 xchcnt ); // 传输的数据个数
需要注意的是,参数ptxbuf和prxbuf是lpvoid型指针变量,当设置spi通讯位宽(cspi_busconfig_t的bitcount成员)为1~8时,数据收发缓存(ptxbuf和prxbuf)需要定义为unit8数据类型,当spi通讯位宽为9~16时,数据收发缓存需要定义为uint16类型,当spi通讯位数为17~32时,数据收发缓存要定义成uint32数据类型。
下面是示例程序片断:
handle hspi; // 定义spi操作handle
dword dwxchcnt; // 定义传输字节个数
cspi_busconfig_t spiconfig; // 定义spi总线配置数据结构体
spiconfig.bitcount = 8; // bit count=8
spiconfig.freq = 16000000; // xch speed = 16m
spiconfig.pha = false; // phase 0 operation
spiconfig.pol = false; // active high operation
// if 1<=cspiconfig.bitcount<=8 收发缓存需要定义为uint8类型
uint8 txdata[1024] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
uint8 rxdata[1024];
// if 9<=cspiconfig.bitcount<=16 收发缓存需要定义为uint16类型
// uint16 txdata[1024] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
// uint16 rxdata[1024];
// if 17<=cspiconfig.bitcount<=32 收发缓存需要定义为uint32类型
// uint32 txdata[1024] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
// uint32 rxdata[1024];
// 打开spi总线 (spiopen( )内部调用了createfile()函数)
hspi = spiopen( text(“spi1:”) );
spiconfig( hspi, &spiconfig ); // 设置spi总线配置信息
dwxchcnt = 5; // 传输5个数据
spiexchange( hspi, txdata, rxdata, dwxchcnt ); // 进行spi数据传输,传输5个数据
2.3 关闭spi
调用closehandle函数关闭由createfile创建的handle即可关闭spi端口。
closehandle( hspi);

高速电路电源完整性测试之电源输出阻抗和环路测试
断电复位热保护器工作原理
喜讯 | 经纬恒润荣获东风柳汽2021年度 “优秀供应商”
意大利LED及智能照明市场状况的简单介绍
普渡科技多款机器人亮相沈阳火锅展,成为展会新亮点
英创信息技术EM9170 SPI接口用户指南简介
新型智慧城市怎样建设
深圳地铁联合华为发布Wi-Fi6技术 引领智慧城轨自动驾驶时代
输出过压保护电路的原理图
UST成功案例——打造数字IT驱动业务底座
广东又一研究院揭牌成立!开展光纤传感系统、视觉测量系统的开发
小米6最新消息:6GB+64GB叫卖2999元?“急疯“小米6和360N5s
明网/深网/暗网的区别及暗网的危害
不止于快!巨湾技研发布凤凰电池技术,可实现全气候全电压平台极速充电
中国28nm和14nm芯片进步神速,未来5nm仍是挑战
比尔·盖茨在1999年提出的15个预测,现在基本都实现了!
工业级以太网交换机在应用上具有哪些优越特性
无人机为何一夜爆红
运用于单相智能电表的IC卡接口电路设计
BICV董红荣:智能网联汽车感知建模与增强交互泛定义两域应用