BeagleBone Black SPI receive rx fail using the ioctl

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;
}

As far as I know … and I am a beginner also been playing with it for a month now… BBB is not compatible with the wifi cape because the spi port is already routed to be used by HDMI bus port. the best way right now is to use a USB wifi and it should work fine.

Hi Helen,

The SCLK pin should be an INPUT.

0x150 0x10 /* spi0_sclk.spi0_sclk, OUTPUT_PULLUP */

That line should be:

0x150 0x30 /* spi0_sclk.spi0_sclk, INPUT_PULLUP */

This is fixed on newer kernels, so I would also advise you to upgrade to
a later version.

On a side note, if you're struggling with SPI then I would recommend
trying out the libsoc[1] librarary.

Cheers,
Jack.

[1] https://github.com/jackmitch/libsoc

If BBB to be a master then th sclk dirction should be output 0x150 0x10 is right?

Hi
did you get solution for this?