#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include "string.h"
static const char *device = "/dev/spidev0.0";
static uint8_t mode = 0; /* SPI通信使用全双工,设置CPOL=0,CPHA=0。 */
static uint8_t bits = 8; /* 8bits读写,MSB first。*/
static uint32_t speed = 1 * 500 * 1000;/* 设置0.5M传输速度 */
static uint16_t delay = 500;
static int g_SPI_Fd = 0;
int SPI_Transfer(const uint8_t *TxBuf, uint8_t *RxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
struct spi_ioc_transfer tr ;
memset(&tr,0x00,sizeof(tr));
tr.tx_buf = (unsigned long) TxBuf,
tr.rx_buf = (unsigned long) RxBuf,
tr.len =len,
tr.delay_usecs = delay;
tr.speed_hz=speed;
tr.bits_per_word=bits;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
{
printf("can't send spi message");
}
else
{
//printf("Send spi message OK %d\n",RxBuf[0]);
}
return 1;
}
/**
* 功 能:关闭SPI模块
*/
int SPI_Close(void)
{
int fd = g_SPI_Fd;
if (fd == 0) /* SPI是否已经打开*/
return 0;
close(fd);
g_SPI_Fd = 0;
return 0;
}
int SPI_Write(uint8_t *TxBuf, int len)
{
int ret;
int fd = g_SPI_Fd;
printf("fd : %d\n",fd);
ret = write(fd, TxBuf, len);
if (ret < 0)
printf("SPI Write errorn");
return ret;
}
int SPI_Open(void)
{
int fd;
int ret = 0;
fd = open(device, O_RDWR);
if (fd < 0)
printf("can't open device");
else
printf("SPI - Open Succeed. Start Init SPI...n");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
if (ret == -1)
printf("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
if (ret == -1)
printf("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't get max speed hz");
printf("\n%d SPI Open Status\n",ret);
g_SPI_Fd=fd;
return ret;
}
int main()
{
uint8_t tx_data[64]={0x1,0x2};
uint8_t rx_data[64]={0};
memset(tx_data,0xAA,64);
SPI_Open();
while(1)
{
SPI_Transfer(tx_data,rx_data,64);
printf("Send spi message OK %d\n",rx_data[0]);
rx_data[0]=0x01;
printf("Spi message Init %d\n",rx_data[0]);
}
return 0;
}
Linux ioctl-SPI主设备
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、设备树文件编写 如上DTS文件片段,SPI Device 节点必须定义在 SPI Master 节点下,其中 ...
- 本文章主要是记录如何利用 RT-Thread Studio 从 0 开始使用 RT-Thread 的 SPI 设备...
- RT-Thread采用了类似于linux的函数调用方法,这里说明一下如何简单的使用设备。 硬件环境 :STM32F...
- 程序可用4种方式读写设备寄存器。 CPOL=0,时钟空闲电平低。CPOL=1,时钟空闲电平高。CPHA=0,周期第...
- 一、前言 前面我们简单的介绍了 I2C总线 的基本框架,本文则将继续讲述另一种常用的 外设总线,即 SPI总线。S...