Интерфейс Beaglebone Black (BBB) ​​с SC16IS750 (SPI для UART)

Я новичок в программировании BBB и C. я написал эту программу для интерфейса SPI
UART ic SC16IS750.
Когда я запускаю эту программу, это мой вывод.

ubuntu@arm:~$ ./Hello
0  0  0  0  0  0  0  0  0  255  255  255  0  � ubuntu@arm:~$

как программа должна работать, я должен прочитать 97; чего не бывает

вот код

Пожалуйста помоги!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <NXCTRL.h>

#include <unistd.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

const uint16_t FCR  = 16;
const uint16_t LCR = 24;
const uint16_t SPR  =56;
const uint16_t DLL  =0;
const uint16_t DLM = 8;
const uint16_t EFR = 16;

static int
__SPI_read (int nFD, uint16_t nAddr, uint16_t *pnD)
{
int nStatus;
struct spi_ioc_transfer xfer[2];
char rchTXData[4];
char rchRXData[4];
int i;

memset(xfer, 0, sizeof(xfer));

// memcpy(rchTXData, &INSTREAD, sizeof(uint8_t));
memcpy(rchTXData , &nAddr, sizeof(uint16_t));
memcpy(rchTXData + 2, pnD, sizeof(uint16_t));

xfer[0].tx_buf = (unsigned int)rchTXData;
xfer[0].rx_buf = (unsigned int)rchRXData;
xfer[0].len = 3;
xfer[0].delay_usecs = 200;

nStatus = ioctl(nFD, SPI_IOC_MESSAGE(1), xfer);

if (nStatus < 0)
{
perror("SPI_IOC_MESSAGE");
return -1;
}

for (i = 0 ; i <= 3 ; i++)
printf (" %d " , rchRXData[i]);

//*pnD = rchRXData[3];
return 0;

}static int
__SPI_write (int nFD, uint16_t nAddr, uint16_t nD)
{
int nStatus;
struct spi_ioc_transfer xfer[2];
char rchTXData[4];
char rchRXData[4];

memset(xfer, 0, sizeof(xfer));

//memcpy(rchTXData, &INSTWRITE, sizeof(uint8_t));
memcpy(rchTXData, &nAddr, sizeof(uint8_t));
memcpy(rchTXData + 1, &nD, sizeof(uint16_t));

xfer[0].tx_buf = (unsigned int)rchTXData;
xfer[0].rx_buf = (unsigned int)rchRXData;
xfer[0].len = 2;
xfer[0].delay_usecs = 200;

nStatus = ioctl(nFD, SPI_IOC_MESSAGE(1), xfer);

if (nStatus < 0)
{
perror("SPI_IOC_MESSAGE");
return -1;
}

return 0;

}

void SPI_UART_Init(int nFD)
{
int x = 0;
char rd;
x = __SPI_write (nFD , LCR , 128 );
printf (" %d " , x);
x = __SPI_write (nFD , DLL , 96 );
printf (" %d " , x);
x = __SPI_write (nFD , DLM , 0 );
printf (" %d " , x);
x = __SPI_write (nFD , LCR , 191 );
printf (" %d " , x);
x = __SPI_write (nFD , EFR , 16 );
printf (" %d " , x);
x = __SPI_write (nFD , LCR , 3 );
printf (" %d " , x);
x = __SPI_write (nFD , FCR , 6 );
printf (" %d " , x);
x = __SPI_write (nFD , FCR , 1 );
printf (" %d " , x);
x = __SPI_write (nFD , SPR , 97 );
printf (" %d " , x);
__SPI_read (nFD , SPR ,&rd );
printf (" %c " , rd );

}

int main (void) {

int nFD, i;
uint8_t nLSB, nD ,rD;
uint32_t nSpeed, nSPIMode;
uint16_t nAddr;nFD = open("/dev/spidev1.0", O_RDWR);nLSB = 0;

ioctl(nFD, SPI_IOC_WR_LSB_FIRST, &nLSB);

nSpeed = 500000;

ioctl(nFD, SPI_IOC_WR_MAX_SPEED_HZ, &nSpeed);

nSPIMode = SPI_MODE_0;

ioctl(nFD, SPI_IOC_WR_MODE, &nSPIMode);nAddr = 305;

nD = -1;for (i = 0; i < 1; i++)

{
SPI_UART_Init(nFD);
usleep(900);
}//  NXCTRLSleep(5, 0);close(nFD);

return(1);
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector