Я пытаюсь отправить 16-битные сообщения от моего черного beaglebone на spidev1.0 (устройство 1 шины 1) на микросхему TLV5618AC
Линия выбора микросхемы должнапереходите от высокого к низкому уровню, прежде чем регистры сдвига начнут собирать биты с падающего фронта часов
Я выполнил модифицированную версию spidev_test.c (оригинал работал нормально).Так как мне нужна строка выбора микросхемы для перехода от высокого к низкому между сообщениями - строка ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
не будет работать, потому что она передает данные в виде одного сообщения.Даже если я помещу ioctl () в цикл for, он не будет работать, потому что это первое и последнее сообщение.
Следующий код работает
static void transfer(int fd)
{
int ret;
unsigned short buffer[1];
int zero = 0;
FILE *iFile = fopen("firsttest.bin", "r");
if (iFile == NULL)
{
printf("Cannot open file \n");
exit(0);
}
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)zero,
.rx_buf = (unsigned long)zero,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
while(!feof(iFile)){
fread(buffer,2,1,iFile);
unsigned short *tx = buffer;
unsigned short rx[1] = {0, };
tr.tx_buf = (unsigned long)tx;
tr.rx_buf = (unsigned long)rx;
int size = ARRAY_SIZE(tx);
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
for (ret = 0; ret < 1; ret++) {
printf("0x%04x\n", tx[ret]);
}
}
}
Этот второй блок кода не
{
int ret;
unsigned short buffer[1];
int zero = 0;
FILE *iFile = fopen("firsttest.bin", "r");
if (iFile == NULL)
{
printf("Cannot open file \n");
exit(0);
}
struct spi_ioc_transfer tr[100];
unsigned short *p = (unsigned short*) calloc(100, sizeof(unsigned short));
unsigned short *p2 = (unsigned short*) calloc(100, sizeof(unsigned short));
while(!feof(iFile)){
unsigned short *tx = p2;
unsigned short *rx=p;
for(int j = 0; j< 100; j++){
fread(buffer,2,1,iFile);
tx = (unsigned short*) &buffer+j;
tr[j].tx_buf = (unsigned long)tx;
tr[j].rx_buf = 0;
tr[j].len = 2;/* Total length of message in bytes*/
tr[j].delay_usecs = delay;
tr[j].speed_hz = speed;
tr[j].bits_per_word = bits;
tr[j].cs_change = 1;
}
ret = ioctl(fd, SPI_IOC_MESSAGE(100), &tr);
if (ret < 1)
pabort("can't send spi message");
for(int v = 0; v<100; v++){
printf("0x%04x\n", rx);
}
}
free(p);
}
Второй блоккода выдает эту ошибку
"не может отправить spi-сообщение: Неверный аргумент"
Поскольку это недопустимый аргумент, я попытался передать '& tr', а также 'tr' в noпомогло.Любой вклад будет оценен.
РЕДАКТИРОВАТЬ: Таким образом, я решил использовать первый код, который работал.Я думаю, что нет причин отправлять крупные переводы.Моя система достаточно быстра, чтобы напряжения были достаточно быстрыми, чтобы эффективно работать в режиме реального времени !!Спасибо за помощь.(Я также много очищал свой код, чтобы его было легче читать!)