标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。