2016-04-25 3 views
0

У меня проблема с обменом данными с MAX31865. Я написал простое приложение linux, но когда я его запускаю, программа никогда не заканчивается. У меня нет ответа от MAX31865.MAX31865 Ошибка связи SPI

вот мой код (только конф):

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

    uint8_t rx[ARRAY_SIZE(tx)]; 
    struct spi_ioc_transfer tr = { 
     .tx_buf = (unsigned long)tx, 
     .rx_buf = (unsigned long)rx, 
     .len = ARRAY_SIZE(tx), 
     .delay_usecs = delay, 
     .speed_hz = 0, 
     .bits_per_word = 0, 
    }; 

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

} 

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

    parse_opts(argc, argv); 

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

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

    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"); 
    printf("%d",bits); 

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

    transfer(fd); 
    printf("max speed: %d Hz\n", speed); 

    transfer(fd); 

    close(fd); 

    return ret; 
} 

буду благодарен за любую помощь

+0

для удобства читаемости и понимания нами людей: 1) последовательно отступать. Отступ после каждой открывающей скобки '{'. un-indent перед каждой закрывающей скобкой '}'. никогда не используйте вкладки для отступов. Предложите использовать 4 пробела для каждого уровня отступов, который достаточно широкий, чтобы быть видимым даже с изменяемыми ширинами шрифтов. – user3629249

+0

У вас проблемы с внешним оборудованием. У вас есть все, что вам нужно, чтобы исправить это. У нас есть немного исходного кода, и программа никогда не заканчивается. У меня нет ответа ». Вы даже не сказали нам, как далеко продвинулась программа, когда вы перешли через нее с вашим отладчиком. Мы даже не знаем, есть ли у вас мощность на чипе. Мы не можем вам помочь, и вы должны были знать, что перед тем, как вы разместили :( –

+0

Вставьте некоторые 'printf' для отладки, чтобы вы точно знали, какой вызов, который стоит за столом – 4386427

ответ

0

Вот мой полный код. Я отмечаю, где проблема

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


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

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

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


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

    uint8_t rx[1]; 
    struct spi_ioc_transfer tr = { 
     .tx_buf = (unsigned long)tx, 
     .rx_buf = (unsigned long)rx, 
     .len = ARRAY_SIZE(tx), 
     .delay_usecs = delay, 
     .speed_hz = 0, 
     .bits_per_word = 0, 
    }; 

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); //->> this ioctl function makes problems 
    if (ret == 1) 
     pabort("can't send spi message"); 

} 

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

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

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

    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"); 
    printf("%d",bits); 

    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); //---> This printf works fine 

    transfer(fd); 
    printf("max speed: %d Hz\n", speed); //--> This printf doesn't work 

    close(fd); 
} 
+0

Зачем читать скорость, бит и т. Д., Если вы не собираетесь использовать их в структуре запросов ввода-вывода? –

+0

Это тестовая программа. Я хочу проверить, как это работает. Это не обязательно. Проблема заключается в функции transfer() – kmbm