11 #include <sys/ioctl.h>
12 #include <linux/types.h>
13 #include <linux/spi/spidev.h>
16 #include "rp_spi.h" /*struct rpi_in */
18 //#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
20 static void pabort(const char *s)
26 static const char *device = "/dev/spidev0.1";
27 static uint8_t mode = 0;
28 static uint8_t bits = 8;
29 static uint32_t speed = 500000;
30 static uint16_t delay = 0;
34 * \brief Testovaci funkce. Odesle same nuly. Delka 64bit. Vysledek vypise.
39 uint8_t tx[]={0,0,0,0,0,0,0,0} ;/*= {
40 0x00, 0x00, 0x01, 0x23, 0x45, 0x67,
41 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
42 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
43 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB,
46 printf("ARRAY_SIZE=%d\n",ARRAY_SIZE);
47 uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu? */
48 struct spi_ioc_transfer tr = {
49 .tx_buf = (unsigned long)tx,
50 .rx_buf = (unsigned long)rx,
54 .bits_per_word = bits,
57 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
59 pabort("can't send spi message");
61 for (ret = 0; ret < ARRAY_SIZE; ret++) {
64 printf("%.2X ", rx[ret]);
68 struct rpi_in spi_read(uint8_t * tx)
76 uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu? */
77 struct spi_ioc_transfer tr = {
78 .tx_buf = (unsigned long)tx,
79 .rx_buf = (unsigned long)rx,
83 .bits_per_word = bits,
86 memset(&in,0,sizeof(in));
88 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
89 /*vypisovani prichozich dat */
92 pabort("can't send spi message");
94 for (ret = 0; ret < ARRAY_SIZE; ret++) {
95 in.debug_rx[ret]=rx[ret];
101 * rx[0] - bity 127 downto 120 the first income bit..127
102 * rx[1] - bity 119 downto 112
103 * rx[2] - bity 111 downto 104
104 * rx[3] - bity 103 downto 96
105 * rx[4] - bity 95 downto 88
106 * rx[5] - bity 87 downto 80
107 * rx[6] - bity 79 downto 72
108 * rx[7] - bity 71 downto 64
109 * rx[8] - bity 63 downto 56
110 * rx[9] - bity 55 downto 48
111 * rx[10] - bity 47 downto 40
112 * rx[11] - bity 39 downto 32
113 * rx[12] - bity 31 downto 24
114 * rx[13] - bity 23 downto 16
115 * rx[14] - bity 15 downto 8
116 * rx[15] - bity 7 downto 0 the last income bit..0
119 /*uprava endianity pozice*/
120 uint8_p=(uint8_t*)&in.pozice;
121 /* x86 je Little-Endian */
122 uint8_p[0]=rx[3]; /* LSB */
125 uint8_p[3]=rx[0]; /*MSB*/ /*with sign bit*/
132 in.hal1=!!(0x80 & rx[4]);
133 in.hal2=!!(0x40 & rx[4]);
134 in.hal3=!!(0x20 & rx[4]);
138 * 92..88 in rx[4] last 5 bits (from left)
139 * 87..81 in rx[5] first 7 bits (from left)
141 in.index_position=0x1F & rx[4];
142 in.index_position<<=8;
143 in.index_position|=0xFE & rx[5];
144 in.index_position>>=1;
146 /* current measurments count
149 * bits 79..72 in rx[6]
152 in.adc_m_count=0x01 & rx[5];
154 in.adc_m_count|=rx[6];
158 * ch2 - bits 71 downto 48
159 * 71..64 in rx[7] - all byte
160 * 63..56 in rx[8] - all byte
161 * 55..48 in rx[9] - all byte
162 * ch0 - bits 47 downto 24
163 * 47..40 in rx[10] - all byte
164 * 39..32 in rx[11] - all byte
165 * 31..24 in rx[12] - all byte
166 * ch1 - bits 23 downto 0
167 * 23..16 in rx[13] - all byte
168 * 15..8 in rx[14] - all byte
169 * 7..0 in rx[15] - all byte
200 fd = open(device, O_RDWR);
202 pabort("can't open device");
203 printf("device open\n");
207 ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
209 pabort("can't set spi mode");
211 ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
213 pabort("can't get spi mode");
218 ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
220 pabort("can't set bits per word");
222 ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
224 pabort("can't get bits per word");
229 ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
231 pabort("can't set max speed hz");
233 ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
235 pabort("can't get max speed hz");
237 printf("spi mode: %d\n", mode);
238 printf("bits per word: %d\n", bits);
239 printf("delay: %d\n", delay);
240 printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);