串行外围接口(SPI)是一个全双工,同步的,四线串行通信接口。SPI设备使用主从架构一个主人。支持多个奴隶设备与个别奴隶选择(SS)行。
ConnectCore平台有几个SPI接口。你可以找到更多的信息硬件参考手册和串行外围接口(SPI)。
数码网络增加了一个Linux API来管理这些SPI接口为主,能够与奴隶设备通信。使用该API,包括头文件如下:
# include< libdigiapix / spi.h >
您可以配置他们和奴隶与其他SPI通信设备。
请求一个SPI
使用SPI之前,您必须请求接口系统上以确保它是可用的。这个请求创建一个主设备和从设备之间的联系。你可以请求一个SPI的以下功能:
函数 | 描述 |
---|---|
|
请求一个SPI的装置和奴隶号码。设备数量(spi_device)是Linux数量分配给SPI接口,和奴隶数量(spi_slave)是奴隶的芯片选择(SS)指数与之通信设备。 它返回一个指针 |
|
请求一个SPI的别名。必须定义在SPI别名映射 它返回一个指针 |
所请求的SPI必须释放一旦不再需要。看到免费的SPI。 |
两个函数可能会失败并返回零
为以下原因:
所提供的设备和奴隶的数字,或相关的设备和奴隶号码不存在给定的别名。
API遇到问题分配内存初始化SPI。您的系统可能会耗尽资源。2022世界杯G组
[…]/ * * /请求一个SPI使用它的别名spi_t spi1 = ldx_spi_request_by_alias (“DEFAULT_SPI”);/ *请求一个使用设备= 1和SPI奴隶= 0 * /spi_t spi2 = ldx_spi_request (1,0);printf (“SPI1使用设备% d % d和奴隶\ n”、spi1 - > spi_device spi1 - > spi_slave);printf (“SPI2使用设备% d % d和奴隶\ n”、spi2 - > spi_device spi2 - > spi_slave);[…]
建立SPI别名
帮助你识别你的SPI接口的设计,你可以指定别名SPI Linux id。映射分配设备号、奴隶和名字的/etc/libdigiapix.conf
文件:
添加一个章节(SPI),如果一个人不存在。
以下部分名称,添加后的SPI接口映射列表格式:
<别名> = < spi_device >、< spi_slave >
地点:
<别名>是人类可读的SPI的名称。
< spi_device >是SPI设备数量。
< spi_slave >是SPI奴隶指数与(SS)通信。
(SPI)# SPI-1 SPI董事会连接器,奴隶0。DEFAULT_SPI=0,0
例如,使用上面的配置中,您可以请求使用SPI的APIDEFAULT_SPI别名。看到请求一个SPI。
你可以得到SPI设备数量和奴隶数量与别名使用这些函数:
intldx_spi_get_device (常量字符*常量spi_alias)
intldx_spi_get_slave (常量字符*常量spi_alias)
信息包括libdigiapix.conf 在你的数码网络嵌入图像的必要,明白了接口定义别名。 |
列出可用的SPI接口
您可以确定可用SPI接口的列表的目标ldx_spi_list_available_devices ()
API函数:
intldx_spi_list_available_devices (uint8_t* *设备)
函数返回可用的SPI接口的数量,或1
如果有一个错误。
当你必须免费设备指针ldx_spi_list_available_devices ()
返回一个值大于0。
[…]uint8_t*设备=零;int我,devices_number =0;[…]/ *获取可用SPI接口的列表* /devices_number = ldx_spi_list_available_devices(设备);如果(devices_number >0{printf ()“目标% d SPI设备:\ n”,devices_number);为(我=0;我< devices_number;我+ +){printf (”(SPI) % d\ n”(我)、设备);}}其他的{printf (“目标没有任何SPI接口可用\ n”);}[…]free(devices); [...]
列出可用的SPI接口的奴隶
除了列出了可用的SPI接口,还可以得到可用奴隶的数量为一个特定的SPI接口:
intldx_spi_list_available_slaves (uint8_tspi_device,uint8_t* *奴隶)
ldx_spi_list_available_slaves
函数返回给定SPI接口可用奴隶的数量,或1如果有一个错误。
当你必须解放奴隶指针ldx_spi_list_available_slaves () 返回一个值大于0。 |
[…]#定义DEFAULT_SPI_DEVICE 0[…]uint8_t*奴隶=零;int我,slaves_number =0;[…]/ *获取可用的SPI奴隶SPI设备列表0 * /slaves_number = ldx_spi_list_available_slaves (DEFAULT_SPI_DEVICE,奴隶);如果(slaves_number >0{printf ()“SPI接口% d % d奴隶可用:\ n”、DEFAULT_SPI_DEVICE slaves_number);为(我=0;我< slaves_number;我+ +){printf (”(SPI) % d % d\ n”、DEFAULT_SPI_DEVICE奴隶[我]);}}其他的{printf (“SPI接口% d没有可用的奴隶\ n”,DEFAULT_SPI_DEVICE);}[…]free(slaves); [...]
免费的SPI
你必须自由所请求的SPI接口时不再需要了。为此,使用ldx_spi_free ()
函数。
intldx_spi_free (spi_t * spi)
[…]spi_t*spi = ...; [...]/ *免费SPI一旦不再需要* /ldx_spi_free (spi);[…]
配置SPI通信
您可以配置多个SPI接口参数使用SPI API:
配置传输模式
SPI接口允许您配置传输参数如下:
时钟模式
时钟模式指定如何管理时钟信号和数据行中转移。其可能的值是:
时钟模式 | 描述 |
---|---|
SPI_CLK_MODE_0 |
CPOL = 0 CPHA = 0 -可用的数据必须在第一时钟信号上升。时钟空闲状态是零。味噌和莫西人线路上的数据时必须稳定时钟高时,可以改变时钟很低。捕获的数据在时钟的过渡和传播到低时钟由低向高。 |
SPI_CLK_MODE_1 |
CPOL = 0 CPHA = 1 -第一时钟信号上升可以用来准备数据。时钟空闲状态是零。味噌和莫西人线路上的数据必须保持稳定而时钟低和时钟高时可以改变。捕获的数据在时钟的盘中时钟由低向高过渡和传播。 |
SPI_CLK_MODE_2 |
CPOL = 1 CPHA = 0 -可用的数据必须在第一时钟信号下降。时钟空闲状态就是其中之一。味噌和莫西人线路上的数据必须保持稳定而时钟低和时钟高时可以改变。捕获的数据在时钟的盘中时钟由低向高过渡和传播。 |
SPI_CLK_MODE_3 |
CPOL = 1 CPHA = 1 -第一时钟信号下降可以用来准备数据。时钟空闲状态就是其中之一。味噌和莫西人线路上的数据时必须稳定时钟高时,可以改变时钟很低。捕获的数据在时钟的过渡和传播到低时钟由低向高。 |
芯片选择
芯片选择配置决定了这条线在转移的行为。其可能的值是:
芯片选择 | 描述 |
---|---|
SPI_CS_ACTIVE_LOW |
芯片选择活跃在低水平 |
SPI_CS_ACTIVE_HIGH |
芯片选择活跃在高水平 |
SPI_CS_NO_CONT |
在传输芯片选择不控制 |
位顺序
位顺序决定了哪些位是转移第一(MSB和LSB)。
位顺序 | 描述 |
---|---|
SPI_BO_MSB_FIRST |
第一转位是最重要的一个 |
SPI_BO_LSB_FIRST |
第一转位是不那么重要 |
所有这些配置参数指定在一个转换配置结构体:
/ * ** spi_transfer_cfg_t - SPI传输模式配置的代表** @clk_mode: SPI时钟模式* @chip_select: SPI芯片选择配置* @bit_order: SPI位顺序* /类型定义结构体{spi_clk_mode_t clk_mode;spi_cs_t chip_select;spi_bo_t bit_order;}spi_transfer_cfg_t;
您可以读取和设置SPI传输模式配置使用这些函数:
函数 | 描述 |
---|---|
|
读取和存储SPI SPI接口的传输模式。 这个函数返回 |
|
设置配置SPI接口的传输模式。 这个函数返回 |
[…]spi_transfer_cfg_t transfer_mode = {0}spi_t spi =…;/ *设置* /传输模式参数transfer_mode。clk_mode = SPI_CLK_MODE_0;transfer_mode。chip_select = SPI_CS_ACTIVE_HIGH;transfer_mode。bit_order = SPI_BO_MSB_FIRST;* / / *配置传输模式&transfer_mode ldx_spi_set_transfer_mode (spi);[…]
配置每一位
SPI传输通常由8位的话。然而,其他词在示例中,16位也很常见。您可以读取和设置SPI bits-per-word价值使用这些函数:
函数 | 描述 |
---|---|
|
|
|
|
[…]spi_t spi =…;/ *配置bits-per-word 16 * /SPI_BPW_16 ldx_spi_set_bits_per_word (spi);printf (“SPI % d。% d % d bits-per-word使用\ n”、spi - > spi_device spi - > spi_slave, ldx_spi_get_bits_per_word (spi) = = SPI_BPW_8吗?8:16);[…]
配置最大总线速度
主人与奴隶之前,您必须配置奴隶设备支持的最大速度。您可以读取和设置SPI总线速度使用这些函数:
函数 | 描述 |
---|---|
|
|
|
|
[…]spi_t spi =…;/ *配置总线速度4 mhz(4000000赫兹)* /ldx_spi_set_speed (spi,4000000);printf (“SPI % d。% d % dHz总线速度\ n”、spi - > spi_device spi - > spi_slave, ldx_spi_get_speed (spi));[…]
与SPI接口进行通信
API允许三种类型的通信与奴隶设备:读、写和转移。
写入数据的SPI接口
你可以发送数据到SPI奴隶设备使用ldx_spi_write ()
功能:
函数 | 描述 |
---|---|
|
|
[…]#定义DATA_SIZE16[…]int我=0;uint8_ttx_buffer [DATA_SIZE] = {0};spi_t spi =…;/ * * / tx缓冲区填充随机数据为(我=0;我< DATA_SIZE;我+ +){tx_buffer[我]= rand () %255年;}printf (“写作SPI % d % d % d字节……\ n”,spi - > spi_device DATA_SIZE spi - > spi_slave);ldx_spi_write (spi、tx_buffer DATA_SIZE);[…]
读取数据的SPI接口
你可以读取数据从设备使用SPI的奴隶ldx_spi_read ()
功能:
函数 | 描述 |
---|---|
|
|
[…]#定义DATA_SIZE16[…]int我=0;uint8_trx_buffer [DATA_SIZE] = {0};spi_t spi =…;printf (“阅读从SPI % d % d % d字节…\ n”,spi - > spi_device DATA_SIZE spi - > spi_slave);ldx_spi_read (spi、rx_buffer DATA_SIZE);为(我=0;我< DATA_SIZE;我+ +){printf (“rx_data % d = 0 x % 2 x\ n”,我,rx_data[我]);}[…]
SPI接口传输数据
你可以同时在一个操作使用读写数据ldx_spi_transfer ()
功能:
函数 | 描述 |
---|---|
|
|
tx_data和rx_data缓冲区长度字节的值必须长度。 |
[…]#定义DATA_SIZE16[…]int我=0;uint8_ttx_buffer [DATA_SIZE] = {0};uint8_trx_buffer [DATA_SIZE] = {0};spi_t spi =…;/ * * / tx缓冲区填充随机数据为(我=0;我< DATA_SIZE;我+ +){tx_buffer[我]= rand () %255年;}printf (“转移与SPI % d % d % d字节……\ n”,spi - > spi_device DATA_SIZE spi - > spi_slave);ldx_spi_transfer (spi、tx_buffer rx_buffer DATA_SIZE);为(我=0;我< DATA_SIZE;我+ +){printf (“rx_data % d = 0 x % 2 x\ n”,我,rx_data[我]);}[…]
SPI的例子
这个例子写一页0的外部EEPROM作为随机数据,然后读取数据来验证它。
您可以导入示例在Eclipse中使用数码网络嵌入插件的必要。有关更多信息,请参见创建一个新的戴伊示例项目。这个例子包含在数码网络嵌入的必要。去GitHub查看应用程序源代码。