linux spi 应用ioctl 使用举例

经过测试可以使用的demo代码

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#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>

static const char *device = "/dev/spidev0.0";
static uint8_t mode = 3; /* SPI通信使用全双工,设置CPOL=0,CPHA=0。 */
static uint8_t bits = 8; /* 8bits读写,MSB first。*/
static uint32_t speed = 100 * 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;

	printf("open spi dev:%s \r\n", device);
    fd = open(device, O_RDWR);
    if (fd < 0)
	{
        	printf("can't open device \n");
		return -1;
	}
    else
        printf("SPI - Open Succeed. Start Init SPI...n\n");

    /*
    * spi mode
    */
    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
    if (ret == -1)
    printf("can't set spi mode\n");


    ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
    if (ret == -1)
    printf("can't get spi mode\n");


    /*
    * bits per word
    */
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    if (ret == -1)
      printf("can't set bits per word\n");


    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
    if (ret == -1)
      printf("can't get bits per word\n");


    /*
    * max speed hz
    */
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
    if (ret == -1)
    printf("can't set max speed hz\n");


    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
    if (ret == -1)
        printf("can't get max speed hz\n");

    g_SPI_Fd=fd;
    return ret;
}


int main(int argc, char *argv[])
{
	
	char send_data[64] = {0};
	char read_data[64] = {0};
	char crc = 0;
	int i = 0;	
	int j = 0;

    system("echo PB6 > /sys/kernel/debug/sunxi_pinctrl/sunxi_pin");
    system("echo PB6 1 > /sys/kernel/debug/sunxi_pinctrl/function");
    system("echo PB6 0 > /sys/kernel/debug/sunxi_pinctrl/data");

	/* spi 初始化程序 */
	SPI_Open();

	send_data[0] = 0x55;
	send_data[1] = 0x00;
	send_data[2] = 0x84;
	send_data[3] = 0x00;
	send_data[4] = 0x08;
	send_data[5] = 0x00;
	send_data[6] = 0x00;

	crc = send_data[1];
	for (i = 2; i < 7; i++)
	{
		crc ^= send_data[i];
	}
	crc = ~crc;

	send_data[7] = crc;

	printf("send data:");
	for (i = 0; i < 8; i++)
	{
		printf("%#x, ", send_data[i]);
	}
	printf("\n");
	
	/* spi 发送数据 */
	SPI_Transfer(send_data,read_data,8);
	
	printf("read data:");
	for (j = 0; j < 20; j++)
	{
		printf("%#x, ", read_data[j]);
	}

	usleep(10000);


	memset(read_data, 0, sizeof(read_data));
	memset(send_data, 0, sizeof(send_data));

	/* spi 读取数据 */
	SPI_Transfer(send_data,read_data,16);	

	printf("read data:");
	for (j = 0; j < 20; j++)
	{
		printf("%#x, ", read_data[j]);
	}

	return 0;
}


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值