Hi Arthur,

BBB is a very time consuming hobby.
Take it ease, relax, go for a walk and when you return, try:

1) try your project as root 
if no luck follow my (working) path

2) Try to repeat my settings and see if it works for you.
I wasn't able to build the original Linux spidev_test, so...

What I have is:
 
root@beaglebone:~# uname -a
Linux beaglebone 3.8.13-bone50 #1 SMP Tue May 13 13:24:52 UTC 2014 armv7l 
GNU/Linux

Following the instruction from here 
http://www.nagavenkat.adurthi.com/2014/02/spi-communication-beaglebone-black-as-master-to-arduino-as-slave/
 

I created SPI-4SS-00A0.dts and compiled it into SPI-4SS-00A0.dts following 
exactly the instruction

By doing that you should have in /sys/devices/bone_capemgr.9/slots

 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,SPI-4SS

To test it I obtained and created files in /opt/test/test2 as attached:
build
SimpleGPIO.cpp - from Derek Molloy 
https://github.com/derekmolloy/beaglebone/blob/master/SimpleGPIO.cpp
SimpleGPIO.h - from Derek Molloy 
https://github.com/derekmolloy/beaglebone/blob/master/SimpleGPIO.h 
test2.cpp - mine main file

unzip attached and compile 

root@beaglebone:/opt/test/test2# ./build
Building test2 - J.Sz.
root@beaglebone:/opt/test/test2#
 
then run (have P9-18 and P9-21 connected as loopback)

root@beaglebone:/opt/test/test2# ./test2
Initialize SS pins for SPI
Initialize SPI
SPI transfer
rx = 30 31 32 33 34 35 36 37
rx = 31 32
rx = 33 34
rx = 35 36
rx = 37 38
rx = 30 31 32 33 34 35 36 37
...

press CTRL-C to terminate or let it run and observe with a scope all SPI0 
signals

Hope this will help

Jan

Sorry, I don't see how to insert a file so:
build is:

#!/bin/bash 
echo "Building test2 - J.Sz." 
g++ test2.cpp SimpleGPIO.cpp -o test2

test2.cpp is

//#ifndef SPICOMM_H_
//#define SPICOMM_H_


#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>
#include "SimpleGPIO.h"
#include <iostream>
#include <string>
#include "SimpleGPIO.h"

using namespace std;

// example functions from 
http://www.nagavenkat.adurthi.com/2014/02/spi-communication-beaglebone-black-as-master-to-arduino-as-slave/

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

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


//4 SS pins for 4 SPI devices
void init_motor_spi_ss(int gpio1,int gpio2,int gpio3,int gpio4){
//export the pins. I have used then pins described in the table above
 gpio_export(gpio1);
 gpio_export(gpio2);
 gpio_export(gpio3);
 gpio_export(gpio4);

// set them as High. The SS pins should be high when idle(no commuication)

 gpio_set_dir(gpio1, OUTPUT_PIN);
 gpio_set_dir(gpio2, OUTPUT_PIN);
 gpio_set_dir(gpio3, OUTPUT_PIN);
 gpio_set_dir(gpio4, OUTPUT_PIN);

gpio_set_value(gpio1, HIGH);
 gpio_set_value(gpio2, HIGH);
 gpio_set_value(gpio3, HIGH);
 gpio_set_value(gpio4, HIGH);

}

static const char *device = "/dev/spidev1.0";  // this is when SPI0 was 
enabled. change it when SPI1 is enabled
static uint8_t mode=0;  //this mode works well for me
static uint8_t bits = 8; //arduino accepts 8 bits at once
//static uint32_t speed = 1000000; //1MHz speed
static uint32_t speed = 1000000; //2MHz speed
static uint16_t delay=0;

static void init_spi(void)
{
 int fd;
 int ret = 0;

 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");

}

void spi_transfer(uint8_t *txbuffer, int size, int gpio) 
{

 int fd;
 int ret = 0;
 //uint8_t tx[8];
 //tx[0]='0';
 //tx[1]='1';
 //tx[2]='2';
 //tx[3]='3';
 //tx[4]='4';
 //tx[5]='5';
 //tx[6]='6';
 //tx[7]='7';

//uint8_t rx[ARRAY_SIZE(txbuffer)] = {0, };
uint8_t rx[size];


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

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


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

close(fd);
gpio_set_value(gpio, HIGH);

 cout<<"rx = ";
 for(int i=0;i<size;i++){
 printf("%.2X",rx[i]);
 cout<<" ";
 }
 cout<<endl;

}      

int main(int argc, char *argv[]){

    cout << "Initialize SS pins for SPI" << endl;
    init_motor_spi_ss(48, 49, 60, 115);

    cout << "Initialize SPI" << endl;
    init_spi();

    cout << "SPI transfer" << endl;
    while(1)


    {

    spi_transfer((uint8_t *)"01234567", 8, 48);
    spi_transfer((uint8_t *)"12", 2, 48);
    spi_transfer((uint8_t *)"34", 2, 49);
    spi_transfer((uint8_t *)"56", 2, 60);
    spi_transfer((uint8_t *)"78", 2, 115);
    }




    return 0;
}


THE END





On Thursday, November 13, 2014 5:10:44 AM UTC+11, [email protected] 
wrote:
>
> Hi Jan,
>
> So I put a simple wire between pin 18 and 21 and try to run the 
> spidev_test... Same result... FF only.... I also check with an 
> oscilloscope. I see nothing... I am not able to see my data.
>
> root@beaglebone:~# ./spidev_test -D /dev/spidev1.0 
>> spi mode: 0
>> bits per word: 8
>> max speed: 500000 Hz (500 KHz)
>> FF FF FF FF FF FF 
>> FF FF FF FF FF FF 
>> FF FF FF FF FF FF 
>> FF FF FF FF FF FF 
>> FF FF FF FF FF FF 
>> FF FF FF FF FF FF 
>> FF FF 
>
>
> So first I am currently using my own dtc file from input on the web :
>
> /dts-v1/;
>> /plugin/;
>> / {
>>     compatible = "ti,beaglebone", "ti,beaglebone-black";
>>     /* identification */
>>     part-number = "spi0pinmux";
>>     fragment@0 {
>>         target = <&am33xx_pinmux>;
>>         __overlay__ {
>>             spi0_pins_s0: spi0_pins_s0 {
>>                 pinctrl-single,pins = <
>>                   0x150 0x30  /* spi0_sclk, INPUT_PULLUP | MODE0 */
>>                   0x154 0x30  /* spi0_d0, INPUT_PULLUP | MODE0 */
>>                   0x158 0x10  /* spi0_d1, OUTPUT_PULLUP | MODE0 */
>>                   0x15c 0x10  /* spi0_cs0, OUTPUT_PULLUP | MODE0 */
>>                 >;
>>             };
>>         };
>>     };
>>     fragment@1 {
>>         target = <&spi0>;
>>         __overlay__ {
>>              #address-cells = <1>;
>>              #size-cells = <0>;
>>              status = "okay";
>>              pinctrl-names = "default";
>>              pinctrl-0 = <&spi0_pins_s0>;
>>              spidev@0 {
>>                  spi-max-frequency = <24000000>;
>>                  reg = <0>;
>>                  compatible = "linux,spidev";
>>             };
>>         };
>>     };
>> };
>
>
> So I build the dtbo file :
>
> dtc -O dtb -o /lib/firmware/BB-ARTHUR-SPI0-00A0.dtbo -b 0 -@ 
>> BB-ARTHUR-SPI0-00A0.dts
>> echo BB-ARTHUR-SPI0 > /sys/devices/bone_capemgr.9/slots
>
>
> Then I run uname -r to get the current linux version :  3.8.13-bone47
> I download kernel source from kernel.org to get the spidev_test.c file. I 
> compile it on the board and I run it.
>
> Do I wrong somewhere ? I am currently running the original EMMC 
> distribution of the beaglebone black ( The board was ordered few weeks ago, 
> so I can guess that I used a very recent version of the beagleboard 
> binary). 
>
> I also found in your link something about patching the kernel :
>
> diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
>> index 911e9e0..622adf5 100644
>> --- a/drivers/spi/spidev.c
>> +++ b/drivers/spi/spidev.c
>> @@ -646,6 +646,7 @@ static int spidev_remove(struct spi_device *spi)
>>  
>>  static const struct of_device_id spidev_dt_ids[] = {
>>         { .compatible = "rohm,dh2228fv" },
>> +       { .compatible = "linux,spidev" },
>>         {},
>>  };
>
>
> Do I have to download my own source to build a beagleboard image and to 
> patch the kernel before with this patch to be able to use SPI ? 
>
> Thanks & Regards,
> Arthur.
>
> Le mardi 11 novembre 2014 00:54:29 UTC+1, [email protected] a écrit :
>>
>> Hi,
>>
>>  Following the links: http://elinux.org/BeagleBone_Black_Enable_SPIDEV 
>> and 
>> http://www.nagavenkat.adurthi.com/2014/02/spi-communication-beaglebone-black-as-master-to-arduino-as-slave/
>>  
>> I was able to make it work, but I have a SS too long (1.4ms) for my need. 
>> For easy test connect MOSI and MISO with a wire (loopback) to eliminate 
>> connection problem with you SPI slave.
>> Hope this will help. When you done, can you measure the timing a let me 
>> know?
>> I can post you my code if you need it.
>>
>> Jan
>>
>> On Tuesday, November 11, 2014 5:03:38 AM UTC+11, [email protected] 
>> wrote:
>>>
>>> Hi,
>>>
>>> I am trying to communicate with a device (ADS1299à by using the 
>>> Beaglebone black but without success. First I have to enable spi dev 
>>> entries in /dev. There are plenty of blog/tuto which are giving dtc file to 
>>> generate our own dtbo. But dtc files seems to not be always the same.
>>>
>>> In fact I can see that there are already some dtbo files in 
>>> /lib/firmware : 
>>> root@beaglebone:~# ls /lib/firmware/ | grep SPI
>>> ADAFRUIT-SPI0-00A0.dtbo
>>> ADAFRUIT-SPI1-00A0.dtbo
>>> BB-SPIDEV0-00A0.dtbo
>>> BB-SPIDEV1-00A0.dtbo
>>> BB-SPIDEV1A1-00A0.dtbo
>>>
>>> So I want to use only SPI0 because I know that SPI1 is already used by 
>>> HDMI. Can I used theses dtbo files ? Is it better to write my own ? It is 
>>> quite strange, when I enable one of theses dtbo files, I get not only one 
>>> but two entries in /dev ??
>>>
>>> Currently I want to validate my wiring between the two boards. I found a 
>>> piece of code to read the device id in register of the device though SPI. 
>>> But when I try to read this register, I can only get 1 or only get 0 
>>> (depends of the dtbo files)
>>>
>>> Any advice of the good way to process here ?
>>>
>>> Thanks & Regards,
>>> Arthur.
>>>
>>>
>>>
>>>
>>>

-- 
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/d/optout.

Reply via email to