Hi all,
I am beginner with the BeagleBone Black board and I have a problem with the 
SPI communication.
I am trying to communicate with the Redpine wifi board by SPI. The 
BeagleBone Black is the master and the wifi board is the slave. 

Part of the configuration of my BB-SPI0DEV-00A0.dts is the follow:

/* state the resources this cape uses */
    exclusive-use =
        /* the pin header uses */
        "P9.17",    /* spi0_cs0 */
        "P9.18",    /* spi0_d1 MOSI */
        "P9.21",    /* spi0_d0 MISO*/
        "P9.22",    /* spi0_sclk */
        /* the hardware ip uses */
        "spi0";
fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            bb_spi0_pins: pinmux_bb_spi0_pins {
                pinctrl-single,pins = <
                    0x150 0x10  /* spi0_sclk.spi0_sclk, OUTPUT_PULLUP | 
MODE0 */
                    0x154 0x30  /* spi0_d0.spi0_d0, INPUT_PULLUP | MODE0 */
                    0x158 0x10  /* spi0_d1.spi0_d1, OUTPUT_PULLUP | MODE0 */
                    0x15c 0x10  /* spi0_cs0.spi0_cs0, OUTPUT_PULLUP | MODE0 
*/
                >;
            };
        };
    };


I made all the configuration for the SPI and I am trying to execute the 
spidev_test exemple.
I am using the osciloscophe, so I can see that the message sent and 
received are corrects!
I am sendding 0x15 0x00 and receiving 0x00 0x58, but in the program, the 
receive rx only shows me 0x00 0x00.
Somebody can help me to find what I am doing wrong? If the osciloscope 
shows me the correct signal for the send, receive, clock and CS. What could 
be wrong in my SPI configuration? I tried so many configurations, I dont 
know if I am setting wrong the ioctl.

Spidev_test exemplo:

#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>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

static void pabort(const char *s)
{
perror(s);
abort();
}

static const char *device = "/dev/spidev1.0";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay = 0;

static void transfer(int fd)
{
int ret;
uint8_t tx[] = {
0x15, 0x00,
};

uint8_t rx[ARRAY_SIZE(tx)] = {0, };

struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");

for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
}


int main(int argc, char *argv[])
{
int ret = 0;
int fd;

fd = open(device, O_RDWR);
if (fd < 0)
pabort("can't open device");

/*
 * spi mode
 */
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode");

ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode");

/*
 * bits per word
 */
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word");

ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word");

/*
 * max speed hz
 */
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz");

ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz");

printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

transfer(fd);

close(fd);

return ret;
}

-- 
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].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to