Hi Jan,

Ok so your first advice was really good. I can see that I was not able to 
run a simple loopback between the D1/D0 pin on the board; So I conclude 
that the problem come from the wire. I was pretty sure about the 
configuration and software part.

So I finally change the jumper/wire used to rely the two pins and then 
miracle....

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 
40 00 00 00 00 95 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
DE AD BE EF BA AD 
F0 0D 

So it was definitely a connexion issue. So Now just need to come back with 
my original setup to test my previous code to communicate between ads1299 
and the Beaglebone black. So yes I move one ! Lets find the next issue !

Thanks again Jan,
Arthur.


Le mercredi 12 novembre 2014 22:57:40 UTC+1, janszyma...@gmail.com a écrit :
>
> 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, lambert...@gmail.com 
> 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, janszyma...@gmail.com 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, lambert...@gmail.com 
>>> 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 beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to