|
发表于 2015-4-13 09:09:40
|
显示全部楼层
本帖最后由 jiangdou 于 2015-4-13 09:22 编辑
- //modify by jiangdou 2013-0612
- #include <assert.h>
- #include <errno.h>
- #include <stdint.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <getopt.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #include <linux/types.h>
- #include <linux/spi/spidev.h>
-
- char buf[10];
- char buf2[10];
- int com_serial;
- int failcount;
-
- struct spi_ioc_transfer xfer[2];
- ////////////////////////
- // Init SPIdev
- ///////////////////////
- int spi_init(char filename[40])
- {
- int file;
- __u8 mode, lsb, bits;
- __u32 speed=25000;
-
- if ((file = open(filename,O_RDWR)) < 0)
- {
- printf("Failed to open the bus.");
- /* ERROR HANDLING; you can check errno to see what went wrong */
- com_serial=0;
- exit(1);
- }
-
- ///////////////
- // Verifications
- ///////////////
- //possible modes: mode |= SPI_LOOP; mode |= SPI_CPHA; mode |= SPI_CPOL; mode |= SPI_LSB_FIRST; mode |= SPI_CS_HIGH; mode |= SPI_3WIRE; mode |= SPI_NO_CS; mode |= SPI_READY;
- //multiple possibilities using |
- /*
- if (ioctl(file, SPI_IOC_WR_MODE, &mode)<0) {
- perror("can't set spi mode");
- return;
- }
- */
-
- if (ioctl(file, SPI_IOC_RD_MODE, &mode) < 0)
- {
- perror("SPI rd_mode");
- return;
- }
- if (ioctl(file, SPI_IOC_RD_LSB_FIRST, &lsb) < 0)
- {
- perror("SPI rd_lsb_fist");
- return;
- }
- //sunxi supports only 8 bits
- /*
- if (ioctl(file, SPI_IOC_WR_BITS_PER_WORD, 8)<0)
- {
- perror("can't set bits per word");
- return;
- }
- */
- if (ioctl(file, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0)
- {
- perror("SPI bits_per_word");
- return;
- }
- /*
- if (ioctl(file, SPI_IOC_WR_MAX_SPEED_HZ, &speed)<0)
- {
- perror("can't set max speed hz");
- return;
- }
- */
- if (ioctl(file, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0)
- {
- perror("SPI max_speed_hz");
- return;
- }
-
-
- printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",filename, mode, bits, lsb ? "(lsb first) " : "", speed);
-
- //xfer[0].tx_buf = (unsigned long)buf;
- xfer[0].len = 2; /* Length of command to write*/
- xfer[0].cs_change = 0; /* Keep CS activated */
- xfer[0].delay_usecs = 1000, //delay in us
- xfer[0].speed_hz = 2500000, //speed
- xfer[0].bits_per_word = 2, // bites per word 8
-
- //xfer[1].rx_buf = (unsigned long) buf2;////modify by jiangdou 2013-0612
- xfer[1].len = 1; /* Length of Data to read */
- xfer[1].cs_change = 0; /* Keep CS activated */
- xfer[0].delay_usecs = 0;
- xfer[0].speed_hz = 2500000;
- xfer[0].bits_per_word = 2;
-
- return file;
- }
- ////////////////////////////////////////
- // Read n bytes from the 1 bytes add
- ///////////////////////////////////////
- int spi_read(int add,int file)
- {
- int status;
- char temp;
- memset(buf, 0, sizeof(buf));
- memset(buf2, 0, sizeof(buf2));
- buf[0] = 0x03; //03 ->读命令
- buf[1] = add;
- //buf[2] = add2; //modify by jiangdou 2013-0612
- xfer[0].tx_buf = (unsigned long)buf;
- xfer[0].len = 2; /* Length of command to write*/
- xfer[1].rx_buf = (unsigned long) buf2;
- xfer[1].len = 1; /* Length of Data to read */
- status = ioctl(file, SPI_IOC_MESSAGE(2), xfer);
- if (status < 0)
- {
- perror("SPI_IOC_MESSAGE");
- return;
- }
- //printf("env: %02x %02x %02x\n", buf[0], buf[1], buf[2]);
- //printf("ret: %02x %02x %02x %02x\n", buf2[0], buf2[1], buf2[2], buf2[3]);
- com_serial=1;
- failcount=0;
-
- temp = buf2[0];
- return temp;
- }
- ////////////////////////////////////////////////////////
- // Write n bytes int the 1 bytes address add
- ///////////////////////////////////////////////////////
- //void spi_write(int cmd,int add,int nbytes,char value[10],int file)
- void spi_write(int cmd,int add,int nbytes,char value[10],int file)
- {
- unsigned char buf[32], buf2[32];
- int status;
- memset(buf, 0, sizeof(buf));
- memset(buf2, 0, sizeof(buf2));
- buf[0] = cmd; //02 ->写命令
- buf[1] = add;
- //buf[2] = add2;
- if (nbytes>=1) buf[2] = value[0];
- if (nbytes>=2) buf[3] = value[1];
- if (nbytes>=3) buf[4] = value[2];
- if (nbytes>=4) buf[5] = value[3];
- xfer[0].tx_buf = (unsigned long)buf;
- xfer[0].len = nbytes+2; /* Length of command to write*/
- status = ioctl(file, SPI_IOC_MESSAGE(1), xfer);
- if (status < 0)
- {
- perror("SPI_IOC_MESSAGE");
- return;
- }
- //printf("env: %02x %02x %02x\n", buf[0], buf[1], buf[2]);
- //printf("ret: %02x %02x %02x %02x\n", buf2[0], buf2[1], buf2[2], buf2[3]);
- com_serial=1;
- failcount=0;
- }
- int main()
- {
-
- unsigned int i;
- char tmp;
- char bufw[10];
- static char temp2[20];
- static char *p = temp2
- int fd = spi_init("/dev/spidev0.0"); //dev spi_init初始化
- tmp = spi_read(0x2C,file); /* 读中断标志寄存器 */
-
- memset(bufw, 0, sizeof(bufw));
- memset(temp2, 0, sizeof(temp2));
- spi_write(0x02,0x2C,1,bufw,file); /* 清除所有中断标志位 */
- }
复制代码 script.bin- [spi3_para]
- spi_used = 0
- spi_cs_bitmap = 1
- spi_cs0 = port:PA05<3><default><default><default>
- spi_cs1 = port:PA09<3><default><default><default>
- spi_sclk = port:PA06<3><default><default><default>
- spi_mosi = port:PA07<3><default><default><default>
- spi_miso = port:PA08<3><default><default><default>
-
- [spi_devices]
- spi_dev_num = 1
- [spi_board0]
- modalias = "spidev"
- max_speed_hz = 12000000
- bus_num = 0
- chip_select = 0
- mode = 3
- full_duplex = 0
- manual_cs = 0
复制代码
|
|