Hi,
I am using the AM3517 processor along with the TI v05.07 SDK that has Linux kernel version: 2.6.37. I wrote a usespace program to use spidev to transmit a block of data from the AM3517 chip to an Atmel uC. I want to use the spidev for speeds greater than 400000. However after explicitly setting the speed to 500000, I get the following when I run my code.
[ 286.275329] spidev spi1.0: setup: speed 3000000, sample leading edge, clk
normal
[ 286.283203] spidev spi1.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
[ 286.290344] spidev spi1.0: spi mode 00
[ 286.296508] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.304382] spidev spi1.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
[ 286.311340] spidev spi1.0: 8 bits per word
[ 286.316223] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.325378] spidev spi1.0: setup mode 0, 8 bits/w, 5000000 Hz max --> 0
[ 286.332427] spidev spi1.0: 5000000 Hz (max)
[ 286.338348] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.346191] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.355499] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.363372] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.372680] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.380554] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.389434] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.397277] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.406372] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.414276] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.424591] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
[ 286.432434] spidev spi1.0: setup: speed 3000000, sample leading edge, clk normal
My code is below-
***********************Spi.c********************************
#include "Spi.h"
#include <iostream>
using namespace std;
int Spi::spiOpen(std::string devspi){
int statusVal = -1;
this->spifd = open(devspi.c_str(), O_RDWR);
if(this->spifd < 0){
perror("could not open SPI device");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_WR_MODE, &(this->mode));
if(statusVal < 0){
perror("Could not set SPIMode (WR)...ioctl fail");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_RD_MODE, &(this->mode));
if(statusVal < 0) {
perror("Could not set SPIMode (RD)...ioctl fail");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_WR_BITS_PER_WORD, &(this->bitsPerWord));
if(statusVal < 0) {
perror("Could not set SPI bitsPerWord (WR)...ioctl fail");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_RD_BITS_PER_WORD, &(this->bitsPerWord));
if(statusVal < 0) {
perror("Could not set SPI bitsPerWord(RD)...ioctl fail");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_WR_MAX_SPEED_HZ, &(this->speed));
if(statusVal < 0) {
perror("Could not set SPI speed (WR)...ioctl fail");
exit(1);
}
statusVal = ioctl (this->spifd, SPI_IOC_RD_MAX_SPEED_HZ, &(this->speed));
if(statusVal < 0) {
perror("Could not set SPI speed (RD)...ioctl fail");
exit(1);
}
return statusVal;
}
int Spi::spiClose(){
int statusVal = -1;
statusVal = close(this->spifd);
if(statusVal < 0) {
perror("Could not close SPI device");
exit(1);
}
return statusVal;
}
int Spi::spiWriteRead( unsigned char *data, int length){
struct spi_ioc_transfer spi[length];
int i = 0;
int retVal = -1;
// one spi transfer for each byte
for (i = 0 ; i < length ; i++){
spi[i].tx_buf = (unsigned long)(data + i); // transmit from "data"
spi[i].rx_buf = (unsigned long)(data + i) ; // receive into "data"
spi[i].len = sizeof(*(data + i)) ;
spi[i].delay_usecs = 0 ;
spi[i].speed_hz = this->speed ;
spi[i].bits_per_word = this->bitsPerWord ;
spi[i].cs_change = 0;
}
retVal = ioctl (this->spifd, SPI_IOC_MESSAGE(length), &spi) ;
if(retVal < 0){
perror("Problem transmitting spi data..ioctl");
exit(1);
}
return retVal;
}
Spi::Spi(){
this->mode = SPI_MODE_0 ;
this->bitsPerWord = 8;
this->speed = 48000000;
this->spifd = -1;
this->spiOpen(std::string("/dev/spidev1.0"));
}
Spi::Spi(std::string devspi, unsigned char spiMode, unsigned int spiSpeed, unsigned char spibitsPerWord){
this->mode = spiMode ;
this->bitsPerWord = spibitsPerWord;
this->speed = spiSpeed;
this->spifd = -1;
this->spiOpen(devspi);
}
Spi::~Spi(){
this->spiClose();
}
************************main.cpp*******************
#include "Spi.h"
using namespace std;
int main(void)
{
Spi spi("/dev/spidev1.0", SPI_MODE_0, 5000000, 8);
//Spi spi;
int i = 6;
unsigned char data[1];
int rx_data=0;
while(i > 0)
{
data[0] = 1;
//data[1] = 'A';
//data[2] = 0;
spi.spiWriteRead(data, sizeof(data) );
rx_data = (int)data[0];
cout<<"the received data is:"<<rx_data<<endl;
i--;
}
return 0;
}
Any help on solving this?