ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

LInux_SPI_APP

2022-06-06 10:03:32  阅读:164  来源: 互联网

标签:int APP LInux ret SPI fd len printf


LInux_SPI_APP


 

 

#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>
#include <strings.h>


#define SPI_DEBUG 0
 
 
/* 
    PC0  clk
    PC1     cs
    PC2     miso
    PC3     mosi
    PD0     DSX
    PA1     rst
    
*/



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 = 12 * 1000 * 1000;/* 设置12M传输速度 */
static uint32_t speed = 20 * 1000;/* 设置12M传输速度 */
static uint16_t delay = 0;
static int g_SPI_Fd = 0;

unsigned char r_buf[256];
unsigned char w_buf[256];

 
 
 
//SPI_Transfer
int SPI_Transfer(const uint8_t *TxBuf, uint8_t *RxBuf, int len)
{
        int ret;
        int fd = g_SPI_Fd;

        struct spi_ioc_transfer tr =    {
                .tx_buf = (unsigned long) TxBuf,
                .rx_buf = (unsigned long) RxBuf,
                .len =    len,
                .speed_hz = 0,

                .delay_usecs = delay,
                .bits_per_word = 2
        };

        ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
        if (ret < 1)
                printf("can't send spi message");
        else
        {
#if SPI_DEBUG
                int i;
                printf("\nsend spi message Succeed");
                printf("\nSPI Send [Len:%d]: ", len);
                for (i = 0; i < len; i++)
                {
                        if (i % 8 == 0)
                                printf("\n\t");
                        printf("0x%02X ", TxBuf[i]);
                }
                printf("\n");

                printf("SPI Receive [len:%d]:", len);
                for (i = 0; i < len; i++)
                {
                        if (i % 8 == 0)
                                printf("\n\t");
                        printf("0x%02X ", RxBuf[i]);
                }
                printf("\n");
#endif
        }
        return ret;
}





//SPI_Write
int SPI_Write(uint8_t *TxBuf, int len)
{
        int ret;
        int fd = g_SPI_Fd;

        ret = write(fd, TxBuf, len);
        if (ret < 0)
                printf("SPI Write error\n");
        else
        {
#if SPI_DEBUG
                int i;
                printf("\nSPI Write [Len:%d]: ", len);
                for (i = 0; i < len; i++)
                {
                        if (i % 8 == 0)
                                printf("\n\t");
                        printf("0x%02X ", TxBuf[i]);
                }
                printf("\n");
#endif
        }

        return ret;
}
 
 
 
 
//SPI_Read
int SPI_Read(uint8_t *RxBuf, int len)
{
        int ret;
        int fd = g_SPI_Fd;
        ret = read(fd, RxBuf, len);
        if (ret < 0)
                printf("SPI Read error\n");
        else{
#if SPI_DEBUG
                int i;
                printf("SPI Read [len:%d]:", len);
                for (i = 0; i < len; i++){
                        if (i % 8 == 0)
                                printf("\n\t");
                        printf("0x%02X ", RxBuf[i]);
                }
                printf("\n");
#endif        
        }
        return ret;
}
 

 
 
 
//SPI_Open
int SPI_Open(const char* device)
{
        int fd;
        int ret = 0;

        if (g_SPI_Fd != 0) /* 设备已打开 */
                return 0xF1;

        fd = open(device, O_RDWR);
        if (fd < 0)
                printf("can't open device");
        else
                printf("SPI - Open Succeed. Start Init SPI...\n");

        g_SPI_Fd = fd;
        /*
         * spi mode
         */
        ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);       //设置spi_device的mode,并调用spi_setup立即使设置生效
        if (ret == -1)
                printf("can't set spi mode");

        ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);      //读取spi_device的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);  //读取spi_device的bits_per_word.
        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);  //读取spi_device的max_speed_hz
        if (ret == -1)
                printf("can't get max speed hz");

        printf("spi mode: %d\n", mode);
        printf("bits per word: %d\n", bits);
        printf("max speed: %d KHz (%d MHz)\n", speed / 1000, speed / 1000 / 1000);

        return ret;
}

 



//SPI_Close
int SPI_Close(void)
{
        int fd = g_SPI_Fd;

        if (fd == 0) /* SPI是否已经打开*/
                return 0;
        close(fd);
        g_SPI_Fd = 0;

        return 0;
}



//SPI_LookBackTest
int SPI_LookBackTest(void)
{
        int ret, i;
        const int BufSize = 16;
        uint8_t tx[BufSize], rx[BufSize];

        bzero(rx, sizeof(rx));
        for (i = 0; i < BufSize; i++)
                tx[i] = i;

        printf("\nSPI - LookBack Mode Test...\n");
        ret = SPI_Transfer(tx, rx, BufSize);
        if (ret > 1)
        {
                ret = memcmp(tx, rx, BufSize);
                if (ret != 0)
                {
                        printf("LookBack Mode Test error\n");
                        //            pabort("error");
                }
                else
                        printf("SPI - LookBack Mode  OK\n");
        }

        return ret;
}





int main(void)
{
        printf("spi lcd main ok!\n");

#if 1
        SPI_Open("/dev/spidev0.0");
        //  uint8_t  spi_tx_data[5]={0x71,0x72,0x73,0x74,0x75};
        uint8_t  spi_tx_data[2]={0xaa,0x55};
        while(1){
                SPI_Write(spi_tx_data, 2);
                static int p=0;
                if(p==0){
                        p=1;
                        system("echo 1  > /sys/class/gpio/gpio96/value");  //DSX
                        system("echo 1  > /sys/class/gpio/gpio1/value");   //rst
                }else{
                        p=0;
                        system("echo 0  > /sys/class/gpio/gpio96/value");
                        system("echo 0  > /sys/class/gpio/gpio1/value");
                }
                printf("spi data ok!\n");
                usleep(5000);
        }

#endif

}






 

 

笔记


 

1.

 

标签:int,APP,LInux,ret,SPI,fd,len,printf
来源: https://www.cnblogs.com/panda-w/p/16347148.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有