LInux_SPI_APP
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 }
Makefile:
CROSS_COMPILE = /opt/gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- CC = $(CROSS_COMPILE)gcc myapp = spi_app.c MYAPP = spi_app all: $(CC) $(myapp) -o $(MYAPP)
笔记
1.
Stay hungry, stay foolish
待续。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!