]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blobdiff - pmsm-control/test_sw/rp_spi.c
Setters made inline.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / rp_spi.c
index a1de3ced99785fd6b49614fd71336eac4e8b2368..d02c1abe308f925840ea2ce5773c03425d31fa7a 100644 (file)
 #include <sys/ioctl.h>
 #include <linux/types.h>
 #include <linux/spi/spidev.h>
+#include <string.h>
 
 #include "rp_spi.h" /*struct rpi_in */
+#include "pmsm_state.h"
 
 //#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 #define ARRAY_SIZE 16
@@ -64,7 +66,7 @@ void transfer()
        }
        puts("");
 }
-struct rpi_in spi_read(uint8_t * tx)
+void spi_read(struct rpi_state* this)
 {
        uint8_t *uint8_p;
        uint16_t tmp;
@@ -72,7 +74,8 @@ struct rpi_in spi_read(uint8_t * tx)
        struct rpi_in in;
        int ret;
 
-       uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu? */
+       uint8_t rx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu */
+       uint8_t tx[ARRAY_SIZE] = {0, }; /* inicializace vsech prvku na nulu */
        struct spi_ioc_transfer tr = {
                .tx_buf = (unsigned long)tx,
                .rx_buf = (unsigned long)rx,
@@ -82,121 +85,171 @@ struct rpi_in spi_read(uint8_t * tx)
                .bits_per_word = bits,
        };
 
+       memset(&in,0,sizeof(in));
+
+       /*Data format:
+        * tx[4] - bity 95 downto 88 - bits that are sent first
+        * tx[5] - bity 87 downto 80
+        * tx[6] - bity 79 downto 72
+        * tx[7] - bity 71 downto 64
+        * tx[8] - bity 63 downto 56
+        * tx[9] - bity 55 downto 48
+        * tx[10] - bity 47 downto 40
+        * tx[11] - bity 39 downto 32
+        * tx[12] - bity 31 downto 24
+        * tx[13] - bity 23 downto 16
+        * tx[14] - bity 15 downto 8
+        * tx[15] - bity 7 downto 0
+        *
+        * bit 95 - ADC reset
+        * bit 94 - enable PWM1
+        * bit 93 - enable PWM2
+        * bit 92 - enable PWM3
+        * bit 91 - shutdown1
+        * bit 90 - shutdown2
+        * bit 89 - shutdown3
+        *      .
+        *      .
+        *      Unused
+        *      .
+        *      .
+        * bits 47 .. 32 - match PWM1
+        * bits 31 .. 16 - match PWM2
+        * bits 15 .. 0  - match PWM3
+        */
+
+
+
+       /* keep the 11-bit cap*/
+
+       if (this->pwm1>2047) this->pwm1=2047;
+       if (this->pwm2>2047) this->pwm2=2047;
+       if (this->pwm3>2047) this->pwm3=2047;
+
+       tx[0]=this->test; /*bit 94 - enable PWM1*/
+
+       /*now we have to switch the bytes due to endianess */
+       /* ARMv6 & ARMv7 instructions are little endian */
+       /*pwm1*/
+       tx[10]=((uint8_t*)&this->pwm1)[1]; /*MSB*/
+       tx[11]=((uint8_t*)&this->pwm1)[0]; /*LSB*/
+
+       /*pwm2*/
+       tx[12]=((uint8_t*)&this->pwm2)[1]; /*MSB*/
+       tx[13]=((uint8_t*)&this->pwm2)[0]; /*LSB*/
+
+       /*pwm3*/
+       tx[14]=((uint8_t*)&this->pwm3)[1]; /*MSB*/
+       tx[15]=((uint8_t*)&this->pwm3)[0]; /*LSB*/
+
+       /*----------------------------------------*/
+
        ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
-       /*vypisovani prichozich dat */
-       /*/
-       if (ret < 1)
+
+
+       if (ret < 1){
                pabort("can't send spi message");
+       }
+
+       /*-----------------------------------------*/
+
 
        for (ret = 0; ret < ARRAY_SIZE; ret++) {
-               if (!(ret % 6))
-                       puts("");
-               printf("%.2X ", rx[ret]);
+               this->spi_dat->debug_rx[ret]=rx[ret];
        }
-       puts("");
+
        /*/
 
        /*prichozi data:
-        * rx[0] - bity 95 downto 88 - bits, that come first
-        * rx[1] - bity 87 downto 80
-        * rx[2] - bity 79 downto 72
-        * rx[3] - bity 71 downto 64
-        * rx[4] - bity 63 downto 56
-        * rx[5] - bity 55 downto 48
-        * rx[6] - bity 47 downto 40
-        * rx[7] - bity 39 downto 32
-        * rx[8] - bity 31 downto 24
-        * rx[9] - bity 23 downto 16
-        * rx[10] - bity 15 downto 8
-        * rx[11] - bity 7 downto 0
+        * rx[0] - bity 127 downto 120 the first income bit..127
+        * rx[1] - bity 119 downto 112
+        * rx[2] - bity 111 downto 104
+        * rx[3] - bity 103 downto 96
+        * rx[4] - bity 95 downto 88
+        * rx[5] - bity 87 downto 80
+        * rx[6] - bity 79 downto 72
+        * rx[7] - bity 71 downto 64
+        * rx[8] - bity 63 downto 56
+        * rx[9] - bity 55 downto 48
+        * rx[10] - bity 47 downto 40
+        * rx[11] - bity 39 downto 32
+        * rx[12] - bity 31 downto 24
+        * rx[13] - bity 23 downto 16
+        * rx[14] - bity 15 downto 8
+        * rx[15] - bity 7 downto 0     the last income bit..0
         */
 
        /*uprava endianity pozice*/
-       uint8_p=(uint8_t*)&in.pozice;
+       uint8_p=(uint8_t*)&this->spi_dat->pozice_raw;
        /* x86 je Little-Endian */
        uint8_p[0]=rx[3]; /* LSB */
        uint8_p[1]=rx[2];
        uint8_p[2]=rx[1];
        uint8_p[3]=rx[0]; /*MSB*/ /*with sign bit*/
-       uint8_p[4]=uint8_p[5]=uint8_p[6]=uint8_p[7]=0;
 
        /*halove sondy
-        * hal1 - bit63
-        * hal2 - bit62
-        * hal3 - bit61
+        * hal1 - bit95
+        * hal2 - bit94
+        * hal3 - bit93
         */
-       in.hal1=!!(0x80 & rx[4]);
-       in.hal2=!!(0x40 & rx[4]);
-       in.hal3=!!(0x20 & rx[4]);
-
-       /*pwm enable
-        * en1 - bit60
-        * en2 - bit59
-        * en2 - bit58
+       this->spi_dat->hal1=!!(0x80 & rx[4]);
+       this->spi_dat->hal2=!!(0x40 & rx[4]);
+       this->spi_dat->hal3=!!(0x20 & rx[4]);
+
+       /* index position
+        * bits 92 downto 81
+        *      92..88 in rx[4] last 5 bits (from left)
+        *      87..81 in rx[5] first 7 bits (from left)
         */
-       in.en1=!!(0x10 & rx[4]);
-       in.en2=!!(0x08 & rx[4]);
-       in.en3=!!(0x04 & rx[4]);
-
-       /*shutdown
-        * shdn1 - bit57
-        * shdn2 - bit56
-        * shdn3 - bit55
+       this->spi_dat->index_position=0x1F & rx[4];
+       this->spi_dat->index_position<<=8;
+       this->spi_dat->index_position|=0xFE & rx[5];
+       this->spi_dat->index_position>>=1;
+
+       /* current measurments count
+        * bits 80 downto 72
+        * bit 80 in rx[5]
+        * bits 79..72 in rx[6]
         */
-       in.shdn1=!!(0x02 & rx[4]);
-       in.shdn2=!!(0x01 & rx[4]);
-       in.shdn3=!!(0x80 & rx[5]);
 
-       /*debug bits
-        *
-        */
-       in.b54=!!(0x40 & rx[5]);
-       in.b53=!!(0x20 & rx[5]);
-       in.b52=!!(0x10 & rx[5]);
-       in.b51=!!(0x08 & rx[5]);
-       in.b50=!!(0x04 & rx[5]);
-       in.b49=!!(0x02 & rx[5]);
-       in.b48=!!(0x01 & rx[5]);
-       in.b47=!!(0x80 & rx[6]);
-       in.b46=!!(0x40 & rx[6]);
-       in.b45=!!(0x20 & rx[6]);
-       in.b44=!!(0x10 & rx[6]);
-       in.b43=!!(0x08 & rx[6]);
-       in.b42=!!(0x04 & rx[6]);
-       in.b41=!!(0x02 & rx[6]);
-       in.b40=!!(0x01 & rx[6]);
-       in.b39=!!(0x80 & rx[7]);
-       in.b38=!!(0x40 & rx[7]);
-       in.b37=!!(0x20 & rx[7]);
-       in.b36=!!(0x10 & rx[7]);
+       this->spi_dat->adc_m_count=0x01 & rx[5];
+       this->spi_dat->adc_m_count<<=8;
+       this->spi_dat->adc_m_count|=rx[6];
+
 
        /** currents
-        * ch0 - bits 35 downto 24
-        *      35..32 in rx[7] - last 4
-        *      31..24 in rx[8] - all bytte
-        * ch1 - bits 23 downto 12
-        *      23..16 in rx[9] - all byte
-        *      15..12 in rx[10] - first 4
-        * ch2 - bits 11 downto 0
-        *      11..8 in rx[10] - last 4
-        *      7..0 in rx[11] - all byte
+        * ch2 - bits 71 downto 48
+        *      71..64 in rx[7] - all byte
+        *      63..56 in rx[8] - all byte
+        *      55..48 in rx[9] - all byte
+        * ch0 - bits 47 downto 24
+        *      47..40 in rx[10] - all byte
+        *      39..32 in rx[11] - all byte
+        *      31..24 in rx[12] - all byte
+        * ch1 - bits 23 downto 0
+        *      23..16 in rx[13] - all byte
+        *      15..8 in rx[14] - all byte
+        *      7..0 in rx[15] - all byte
         */
 
-       in.ch0=0x0F & rx[7];
-       in.ch0<<=8;
-       in.ch0|=rx[8];
-
-       in.ch1= rx[9];
-       in.ch1<<=8;
-       in.ch1|=(rx[10] & 0xF0);
-       in.ch1>>=4;
+       this->spi_dat->ch2=rx[7];
+       this->spi_dat->ch2<<=8;
+       this->spi_dat->ch2|=rx[8];
+       this->spi_dat->ch2<<=8;
+       this->spi_dat->ch2|=rx[9];
 
-       in.ch2=(0xF & rx[10]);
-       in.ch2<<=8;
-       in.ch2|=rx[11];
+       this->spi_dat->ch0=rx[10];
+       this->spi_dat->ch0<<=8;
+       this->spi_dat->ch0|=rx[11];
+       this->spi_dat->ch0<<=8;
+       this->spi_dat->ch0|=rx[12];
 
+       this->spi_dat->ch1=rx[13];
+       this->spi_dat->ch1<<=8;
+       this->spi_dat->ch1|=rx[14];
+       this->spi_dat->ch1<<=8;
+       this->spi_dat->ch1|=rx[15];
 
-       return in;
 
 
 }