spi


#include <stdint.h>
#include <unistd.h>
#include  <string.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>


#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))


static void pabort(const char *s)
{
    perror(s);
    abort();
}


static const char *device = "/dev/spidev2.0";
static uint8_t mode = 0;
static uint8_t bits = 9;

static uint32_t speed = 500000;
static uint16_t delay;


static void transfer(int fd)
{
    int ret;
    uint8_t tx[] = {
        //0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        //0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
        //0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        //0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        //0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
        //0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
        //0xF0, 0x0D,
        0xA5,0xF0,0x85
    };
    uint8_t rx[ARRAY_SIZE(tx)] = { 0, };
    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = (unsigned long)rx,
        .len = ARRAY_SIZE(tx),
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
    };


    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
    if (ret < 1)
        pabort("can't send spi message");


    for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
        if (!(ret % 6))
            puts("");
        printf("%.2X ", rx[ret]);
    }
    puts("");
}


static void send_cmd(int fd, uint8_t cmd, uint8_t size)
{
    int ret;
    uint16_t tx[64] = { 0 };
    uint16_t rx[ARRAY_SIZE(tx)] = { 0 };

    //tx[0] = cmd;
    
#if 0
    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = (unsigned long)rx,
        .len = size * 2,//sizeof(tx),  
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
    };
#endif

      unsigned char  databuffer[4]; 
      struct spi_ioc_transfer    xfer[2];   
      tx[0] = cmd & 0x00ff;        
      tx[1] = 0x00 | (cmd >> 8);    
      
      memset(xfer, 0, 2*sizeof(struct spi_ioc_transfer));   
      memset(databuffer, 0x00, 2);

      xfer[0].tx_buf          = (unsigned long)tx;  
      xfer[0].rx_buf          = (unsigned long)databuffer;   
      xfer[0].len             = 2 * size;   
      xfer[0].delay_usecs     = delay;  
      xfer[0].bits_per_word   = bits;   
      xfer[0].speed_hz        = speed;
      
#if 0
      xfer[1].rx_buf          = (unsigned long)databuffer;  
      xfer[1].tx_buf          = NULL; 
      xfer[1].len             = 2;  
      xfer[1].delay_usecs     = delay;   
      xfer[1].bits_per_word   = bits;      
      xfer[1].speed_hz        = speed;     
 #endif
 
    ret = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
    if (ret < 1)
        pabort("can't send spi message");
    printf("read:\r\n ");
    
    for (ret = 0; ret < size; ret++) {
        printf("%.2X ", rx[ret]);
    }
    
       printf("\n");
    printf("databuffer[0]=0x%x\n",databuffer[0]); 
      printf("databuffer[1]=0x%x\n",databuffer[1]);  
      printf("databuffer[2]=0x%x\n",databuffer[2]);   
      printf("databuffer[3]=0x%x\n",databuffer[3]);
    printf("\r\n ");
}

static void send_data(int fd, uint8_t data)
{     
    int ret;
    uint16_t tx[1];
    uint16_t rx[ARRAY_SIZE(tx)] = { 0 };

      // tx[0] = data;
      
      tx[0] = data & 0x00ff;        
      // tx[1] = 0x100 | (data >> 8);//1000 0000 | 0X1010 1010 = 0X1000 0000
       tx[0] |= 0x100;
       struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = 0,
        .len =  2,//sizeof(tx),  
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
    };

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
    if (ret < 1)
        pabort("can't send spi message");
    printf("read:\r\n ");
    for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
        printf("%.2X ", rx[ret]);
    }
    printf("\r\n ");
}


static void print_usage(const char *prog)
{
    printf("Usage: %s [-DsbdlHOLC3]\n", prog);
    puts("  -D --device   device to use (default /dev/spidev1.1)\n"
        "  -s --speed    max speed (Hz)\n"
        "  -d --delay    delay (usec)\n"
        "  -b --bpw      bits per word \n"
        "  -l --loop     loopback\n"
        "  -H --cpha     clock phase\n"
        "  -O --cpol     clock polarity\n"
        "  -L --lsb      least significant bit first\n"
        "  -C --cs-high  chip select active high\n"
        "  -3 --3wire    SI/SO signals shared\n");
    exit(1);
}


static void parse_opts(int argc, char *argv[])
{
    while (1) {
        static const struct option lopts[] = {
            { "device",  1, 0, 'D' },
            { "speed",   1, 0, 's' },
            { "delay",   1, 0, 'd' },
            { "bpw",     1, 0, 'b' },
            { "loop",    0, 0, 'l' },
            { "cpha",    0, 0, 'H' },
            { "cpol",    0, 0, 'O' },
            { "lsb",     0, 0, 'L' },
            { "cs-high", 0, 0, 'C' },
            { "3wire",   0, 0, '3' },
            { "no-cs",   0, 0, 'N' },
            { "ready",   0, 0, 'R' },
            { NULL, 0, 0, 0 },
        };
        int c;


        c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);


        if (c == -1)
            break;


        switch (c) {
        case 'D':
            device = optarg;
            break;
        case 's':
            speed = atoi(optarg);
            break;
        case 'd':
            delay = atoi(optarg);
            break;
        case 'b':
            bits = atoi(optarg);
            break;
        case 'l':
            mode |= SPI_LOOP;
            break;
        case 'H':
            mode |= SPI_CPHA;
            break;
        case 'O':
            mode |= SPI_CPOL;
            break;
        case 'L':
            mode |= SPI_LSB_FIRST;
            break;
        case 'C':
            mode |= SPI_CS_HIGH;
            break;
        case '3':
            mode |= SPI_3WIRE;
            break;
        case 'N':
            mode |= SPI_NO_CS;
            break;
        case 'R':
            mode |= SPI_READY;
            break;
        default:
            print_usage(argv[0]);
            break;
        }
    }
}


int main(int argc, char *argv[])
{
    int ret = 0;
    int fd;


//    parse_opts(argc, argv);
    //mode |= SPI_3WIRE;
    mode |= SPI_MODE_3;

    fd = open(device, O_RDWR);
    if (fd < 0)
        pabort("can't open device");

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

    mode = SPI_3WIRE ;

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


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


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


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


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


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


    //transfer(fd);
    send_cmd(fd, 0x01, 1);
    usleep(10000);

    send_cmd(fd, 0xb2, 1); 
    send_data(fd, 0x0c); 
    send_data(fd, 0x0c); 
    send_data(fd, 0x00); 
    send_data(fd, 0x33); 
    send_data(fd, 0x33); 


    send_cmd(fd, 0xb2, 1);
    send_data(fd, 0x0c);
    send_data(fd, 0x0c);
    send_data(fd, 0x00);
    send_data(fd, 0x33);
    send_data(fd, 0x33);

    send_cmd(fd, 0xb7, 1);
    send_data(fd, 0x35);

    send_cmd(fd, 0x3A, 1);
    send_data(fd, 0x55);
    //---------------------------------ST7789S Power setting--------------------------------------//
    send_cmd(fd, 0xbb, 1);
    send_data(fd, 0x30);//vcom

    send_cmd(fd, 0xc3, 1);
    send_data(fd, 0x1C);//17璋冩繁娴?

    send_cmd(fd, 0xc4, 1);
    send_data(fd, 0x18);

    send_cmd(fd, 0xc6, 1);
    send_data(fd, 0x0f);

    send_cmd(fd, 0xd0, 1);
    send_data(fd, 0xa4);
    send_data(fd, 0xa2);

    send_cmd(fd, 0xe0, 1);
    send_data(fd, 0xf0);
    send_data(fd, 0x00);
    send_data(fd, 0x0a);
    send_data(fd, 0x10);
    send_data(fd, 0x12);
    send_data(fd, 0x1b);
    send_data(fd, 0x39);
    send_data(fd, 0x44);
    send_data(fd, 0x47);
    send_data(fd, 0x28);
    send_data(fd, 0x12);
    send_data(fd, 0x10);
    send_data(fd, 0x16);
    send_data(fd, 0x1b);

    send_cmd(fd, 0xe1, 1);
    send_data(fd, 0xf0);
    send_data(fd, 0x00);
    send_data(fd, 0x0a);
    send_data(fd, 0x10);
    send_data(fd, 0x11);
    send_data(fd, 0x1a);
    send_data(fd, 0x3b);
    send_data(fd, 0x34);
    send_data(fd, 0x4e);
    send_data(fd, 0x3a);
    send_data(fd, 0x17);
    send_data(fd, 0x16);
    send_data(fd, 0x21);
    send_data(fd, 0x22);

    send_cmd(fd, 0x3a, 1);
    send_data(fd, 0x55); //18 RGB ,55-16BIT RGB


    //send_cmd(fd, 0xb7, 1); 
    //send_data(fd, 0x35); 
    //usleep(120000);     //Delay 120ms 

    //************************
    send_cmd(fd, 0x11, 1);
    usleep(120000);      //Delay 120ms 

    send_cmd(fd, 0x29, 1); //display on
    send_cmd(fd, 0x2c, 1);


    //while (1) {
    
        //send_data(fd, 0x55); 
        //send_cmd(fd, 0xdc, 2);
    //}
    
    for (int i = 0; i < 240 * 320; i++) {
        send_data(fd, 0xAA); 
    }

    
    //send_cmd(fd, 0x04, 5);//Read display identification information (04h)
    //send_cmd(fd, 0x09, 6);//Read Display Status (09h)
    //send_cmd(fd, 0xdc, 3);//Read ID3 (DCh)
    close(fd);


    return ret;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值