I have the SPI working for full duplex, but for a half-duplex device. 

The issue is the *receive* array does not return the correct values. 

The O-Scope shows the device is returning the correct values but they are 
recorded as the least significant nibble...doubled.

If 0x01 is returned I have 0x03 stored in the array. If 0x0A is returned I 
have 0xCC stored in the array. It's as if the "read" only works for the 
final 4 bits and at double the speed. Any data in the high nibble is lost.

Has anyone experienced this before or know of something I can do to have 
the correct values stored?


This is the code I used. 

*int fd, i=0;                   //file handle and loop counter*
*unsigned char value, null=0x00;         //sending only a single char*
*uint8_t bits = 8, mode = 0;             //8-bits per word, SPI mode 3*
*uint32_t speed = 4000000;               //Speed is 4 MHz  (Not Really due 
to clock, but it works)*

*unsigned char send_buffer[3];*
*unsigned char receive_buffer[3];*

*int transfer(int fd, unsigned char send[], unsigned char receive[], int 
length){*

*   struct spi_ioc_transfer transfer[3];           //the transfer structure*
*   memset(&transfer, 0, sizeof(transfer));*
   
*   transfer[0].cs_change = 0;*
*   transfer[0].tx_buf = (unsigned long) send;     //the buffer for sending 
data*
*   transfer[0].rx_buf = (unsigned long) receive;  //the buffer for 
receiving data*
*   transfer[0].len = length;                      //the length of buffer*
*   transfer[0].speed_hz = speed;                //the speed in Hz*
*   transfer[0].bits_per_word = bits;                 //bits per word*
*   transfer[0].delay_usecs = 0;                   //delay in us*
*   transfer[0].pad = 0;                   //delay in us*
*   transfer[0].rx_nbits = 8;                   //delay in us*


*   // send the SPI message (all of the above fields, inc. buffers)*
*   int status = ioctl(fd, SPI_IOC_MESSAGE(1), &transfer);*
*   if (status < 0) {*
*      printf("SPI: SPI_IOC_MESSAGE Failed:\t%i", status);*
*      return -1;*
*   }*
*}*




*int main(){   // The following calls set up the SPI bus properties   if 
((fd = open(SPI_PATH, O_RDWR))<0){      perror("SPI Error: Can't open 
device.");      return -1;   }   if (ioctl(fd, SPI_IOC_WR_MODE, 
&mode)==-1){      perror("SPI: Can't set SPI mode.");      return -1;   }  
 if (ioctl(fd, SPI_IOC_RD_MODE, &mode)==-1){      perror("SPI: Can't get 
SPI mode.");      return -1;   }   if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, 
&bits)==-1){      perror("SPI: Can't set bits per word.");      return -1;  
 }   if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits)==-1){      perror("SPI: 
Can't get bits per word.");      return -1;   }   if (ioctl(fd, 
SPI_IOC_WR_MAX_SPEED_HZ, &speed)==-1){      perror("SPI: Can't set max 
speed HZ");      return -1;   }   if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, 
&speed)==-1){      perror("SPI: Can't get max speed HZ.");      return -1;  
 }   // Check that the properties have been set   printf("SPI Mode is: 
%d\n", mode);   printf("SPI Bits is: %d\n", bits);   printf("SPI Speed is: 
%d\n", speed);   printf("Attempting to right IDLE to CC1101:\n");  
 transfer(fd, send_buffer, receive_buffer, 2);}*

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/5c33ebae-cb38-4fc7-8f58-a4b1022e8df1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to