当前位置: 首页 > news >正文

企业网站建设多少家漳州seo网站快速排名

企业网站建设多少家,漳州seo网站快速排名,网站是否有管理员权限,工服定制公司文章目录1- 使能imx6ull开发板SPI驱动2- 回环测试imx6ull开发板物理连接3- 编程SPI回环测试4- 代码重难点分析(1)spi_device结构体(2)spi_ioc_transfer结构体(3)ioctl函数对于SIP不了解的可以参考这篇文章&…

文章目录

    • 1- 使能imx6ull开发板SPI驱动
    • 2- 回环测试imx6ull开发板物理连接
    • 3- 编程SPI回环测试
    • 4- 代码重难点分析
      • (1)spi_device结构体
      • (2)spi_ioc_transfer结构体
      • (3)ioctl函数


对于SIP不了解的可以参考这篇文章:SPI协议介绍

1- 使能imx6ull开发板SPI驱动

想要使能40pin扩展口的SPI1的话,需要修改开发板上的DTOverlay配置文件,添加该管脚对SPI1的支持,具体修改具体方法为修改 eMMC 启动介质的 boot 分区下的 config.txt 文件,将dtoverlay_spi1的选项修改为yes,然后重启应用就可以了。

root@igkboard:~# vi /run/media/mmcblk1p1/config.txt
# Enable SPI overlay, SPI1 conflict with UART8(NB-IoT/4G module)
dtoverlay_spi1=yes

系统启动时将会自动加载 SPI 协议驱动。查看/dev下是否存在spi设备节点,已验证spi驱动是否加载。

root@igkboard:~# ls -l /dev/spidev0.0
crw------- 1 root root 153, 0 Mar  4 05:56 /dev/spidev0.0

2- 回环测试imx6ull开发板物理连接

我们可以看见开发板上的40pin扩展口上:
GPIO03_IO27 -----> ECSPI1_MOSI
GPIO03_IO28 -----> ECSPI1_MISO

在这里插入图片描述
回环测试,找到IGKBoard的SPI1的MISO和MOSI管脚,使用杜邦线或跳线帽短接即可,如下图所

在这里插入图片描述


3- 编程SPI回环测试

源码:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>typedef struct spi_ctx_s
{int       fd;char      dev[64];uint8_t   bits;uint16_t  delay;uint32_t  mode;uint32_t  speed;
}spi_ctx_t;static int spi_init(spi_ctx_t *spi_ctx);/*设备初始化函数*/
static int spi_transmit_receive(spi_ctx_t *spi_ctx, uint8_t const *tx, uint8_t const *rx,size_t len);int main(int argc, char* argv[])
{char          *input_tx = "Hello.I am WangDengtao.";//默认发送的数据char          *spi_dev = "/dev/spidev0.0";//默认设备的位置uint32_t      spi_speed = 500000;//默认速率500kspi_ctx_t     spi_ctx;char          rx_buf[60];if(2 != argc){printf("This is the procedure of spi loopback test.\n");printf("Please input %s /dev/spidev***.\n", argv[0]);return 0;}memset(&spi_ctx, 0, sizeof(spi_ctx));strncpy(spi_ctx.dev, spi_dev, sizeof(spi_ctx.dev));//将设备地址拷贝到结构体中,方便初始化调用spi_ctx.bits = 8;//数据长度spi_ctx.delay = 100;//两个spi_ioc_transfer之间的延时,微秒/*
#define SPI_MODE_0  (0|0)               //模式0
#define SPI_MODE_1  (0|SPI_CPHA)        //模式1
#define SPI_MODE_2  (SPI_CPOL|0)        //模式2
#define SPI_MODE_3  (SPI_CPOL|SPI_CPHA) //模式3*/spi_ctx.mode = SPI_MODE_2;//设置spi模式spi_ctx.speed = spi_speed;///通讯速率if(spi_init(&spi_ctx) < 0){printf("spi_init error\n");return -1;}printf("SPI %s [fd=%d] init successfully\n",spi_ctx.dev, spi_ctx.fd);if(spi_transmit_receive(&spi_ctx, input_tx, rx_buf, strlen(input_tx)) < 0){printf("spi_transmit_receive error\n");return -2;}/*打印 tx_buf 和 rx_buf*/printf("tx_buf: | %s |\n", input_tx);printf("rx_buf: | %s |\n", rx_buf);return 0;
}/*数据收发函数*/
static int spi_transmit_receive(spi_ctx_t *spi_ctx, uint8_t const *tx, uint8_t const *rx,size_t len)
{/*应用程序空间需要从spi设备传输数据时候每组数据元素就是 struct spi_ioc_transfer 结构体类型*/struct spi_ioc_transfer tr = {.tx_buf = (unsigned long)tx,.rx_buf = (unsigned long)rx,.len = len,.delay_usecs = spi_ctx->delay,.speed_hz = spi_ctx->speed,.bits_per_word = spi_ctx->bits,};if(ioctl(spi_ctx->fd, SPI_IOC_MESSAGE(1), &tr) < 0){printf("SPI transmit and receive error: %s\n", strerror(errno));return -1;}return 0;
}/*设备初始化函数*/
int spi_init(spi_ctx_t *spi_ctx)
{int ret;spi_ctx->fd = open(spi_ctx->dev, O_RDWR);if(spi_ctx->fd < 0){printf("Open %s error:%s\n", spi_ctx -> dev, strerror(errno));return -1;}/*设置spi接收和发送的工作模式*/ret = ioctl(spi_ctx->fd, SPI_IOC_RD_MODE, &spi_ctx->mode);if(ret < 0){printf("SPI set SPI_IOC_RD_MODE [0x%x] error:%s\n", spi_ctx->mode, strerror(errno));goto CleanUp;}ret = ioctl(spi_ctx->fd, SPI_IOC_WR_MODE, &spi_ctx->mode);if(ret < 0){printf("SPI set SPI_IOC_WR_MODE [0x%x] error:%s\n", spi_ctx->mode, strerror(errno));goto CleanUp;}/*设置spi通信接收和发送的字长*/ret = ioctl(spi_ctx->fd, SPI_IOC_RD_BITS_PER_WORD, &spi_ctx->bits);if(ret < 0){printf("SPI set SPI_IOC_RD_BITS_PER_WORD [%d] error:%s\n",spi_ctx->bits, strerror(errno));goto CleanUp;}ret = ioctl(spi_ctx->fd, SPI_IOC_WR_BITS_PER_WORD, &spi_ctx->bits);if(ret < 0){printf("SPI set SPI_IOC_WR_BITS_PER_WORD [%d] error:%s\n",spi_ctx->bits, strerror(errno));goto CleanUp;}/*设置最高工作频率*/ret = ioctl(spi_ctx->fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_ctx->speed);if(ret == -1){printf("SPI set SPI_IOC_WR_MAX_SPEED_HZ [%d] error:%s\n", spi_ctx->speed, strerror(errno));goto CleanUp;}ret = ioctl(spi_ctx->fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_ctx->speed);if(ret == -1){printf("SPI set SPI_IOC_RD_MAX_SPEED_HZ [%d] error:%s\n", spi_ctx->speed, strerror(errno));goto CleanUp;}printf("spi mode: 0x%x\n", spi_ctx->mode);printf("bits per word: %d\n", spi_ctx->bits);printf("max speed: %d KHz\n", spi_ctx->speed /1000);return spi_ctx->fd;CleanUp:close(spi_ctx->fd);return -1;
}

makefile:

CC=arm-linux-gnueabihf-gcc
APP_NAME=spi_testall:clean@${CC} ${APP_NAME}.c -o ${APP_NAME}clean:@rm -f ${APP_NAME}

tftp不了解的小伙伴可以参考这篇文章:wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器
tftp服务器下载到开发板运行:

root@igkboard:~# tftp -gr spi_test 192.168.10.168
root@igkboard:~# chmod a+x spi_test
root@igkboard:~# ./spi_test /dev/spidev0.0 
spi mode: 0x4
bits per word: 8
max speed: 500 KHz
SPI /dev/spidev0.0 [fd=3] init successfully
tx_buf: | Hello.I am WangDengtao. |
rx_buf: | Hello.I am WangDengtao. |

4- 代码重难点分析

(1)spi_device结构体

虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它。
在我们的代码中,我们就使用到了:

spi_ctx.mode = SPI_MODE_2;//设置spi模式
//设置读写的工作模式
ioctl(spi_ctx->fd, SPI_IOC_RD_MODE, &spi_ctx->mode);
ioctl(spi_ctx->fd, SPI_IOC_WR_MODE, &spi_ctx->mode);

SPI_MODE_2是设置spi模式为第二种模式,在开头推荐的第一篇文章中有讲到。

在内核中,每个spi_device代表一个物理的SPI设备:

struct spi_device {structdevice              dev;structspi_master         *master;u32                       max_speed_hz;        /* 通信时钟最大频率 */u8                        chip_select;         /* 片选号 */u8                        mode;                /*SPI设备的模式,下面的宏是它各bit的含义  */
#define       SPI_CPHA        0x01                      /* 采样的时钟相位                            */
#define       SPI_CPOL        0x02                      /* 时钟信号起始相位:高或者是低电平*/
#define       SPI_MODE_0     (0|0)                    
#define       SPI_MODE_1     (0|SPI_CPHA)
#define       SPI_MODE_2     (SPI_CPOL|0)
#define       SPI_MODE_3     (SPI_CPOL|SPI_CPHA)
#define       SPI_CS_HIGH     0x04                      /* 为1时片选的有效信号是高电平*/
#define       SPI_LSB_FIRST   0x08                      /* 发送时低比特在前  */
#define       SPI_3WIRE       0x10                      /* 输入输出信号使用同一根信号线 */
#define       SPI_LOOP        0x20                      /* 回环模式 */u8                        bits_per_word;       /* 每个通信字的字长(比特数) */int                       irq;                 /*使用到的中断 */void                     *controller_state;void                     *controller_data;char                      modalias[32];        /* 设备驱动的名字*/
};

(2)spi_ioc_transfer结构体

应用程序空间需要从spi设备传输数据时候,每组数据元素就是 struct spi_ioc_transfer 结构体类型,该结构体定义如下:

struct spi_ioc_transfer {__u64 tx_buf; //发送数据缓存__u64 rx_buf; //接收数据缓存__u32 len; //数据长度__u32 speed_hz; //通讯速率__u16 delay_usecs; //两个spi_ioc_transfer之间的延时,微秒__u8 bits_per_word; //数据长度__u8 cs_change; //取消选中片选__u8 tx_nbits; //单次数据宽度(多数据线模式)__u8 rx_nbits; //单次数据宽度(多数据线模式)__u8 word_delay_usecs;__u8 pad;/* If the contents of 'struct spi_ioc_transfer' ever change* incompatibly, then the ioctl number (currently 0) must change;* ioctls with constant size fields get a bit more in the way of* error checking than ones (like this) where that field varies.** NOTE: struct layout is the same in 64bit and 32bit userspace.*/
};

(3)ioctl函数

在编写应用程序时还需要使用ioctl函数设置spi相关配置,其函数原型如下:

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);

其中对于SPI设备request的值常用的有以下几种:
在这里插入图片描述
当然,如果要使用上述的参数的话,需要头文件#include <linux/spi/spidev.h>


http://www.wooajung.com/news/27546.html

相关文章:

  • 网站制作公司crm客户管理系统友情链接检索数据分析
  • 网站ftp根目录小程序开发公司哪里强
  • 网站上的产品板块seo排名优化软件有
  • 徐州英文网站优化魔贝课凡seo
  • 做网站的公司怎么找客户百度快速收录技术
  • 用php做电商网站有哪些营销培训课程2022
  • 怎样做专业网站成都关键词优化平台
  • 常州网站推广优化产品seo标题是什么
  • 哪家网站开发好百度关键词推广2元一天
  • 深圳网站建设培训班长沙seo行者seo09
  • 上海 网站建设公司百度人工电话
  • 做网站运用的技术包就业的培训机构
  • wordpress图片集网站seo检测工具
  • 一个网站3个相似域名百度热门排行榜
  • 网站后台关键词个人网站模板建站
  • 用友公司能不能做网站建设太原网络营销公司
  • 如何做盗版小说网站百度提交网站
  • 娄底高端网站建设杭州优化建筑设计
  • 网站自己可以做么市场调研报告模板
  • 招聘网站可以做劳务派遣吗企业网站建设方案
  • 怎么样做微网站江门关键词排名工具
  • 平台网站建设哪家好谷歌google搜索引擎入口
  • 罗湖网站-建设深圳信科太原seo公司
  • 网站业务怎么做的网页链接
  • 单页营销网站怎么做公司营销网站建设
  • 做网站改版的苏州疫情最新情况
  • 可以做网站的电脑软件打开百度网站
  • wordpress添加小说板块朝阳seo排名
  • 网站制作工作流程宁波专业seo服务
  • 做妓的网站百度推广竞价开户