gpt4 book ai didi

c - read()/ioctl 干扰 GPIO 信号?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:57 24 4
gpt4 key购买 nike

我连接了一个 Linux 嵌入式板(基于 imx233)和一个 MSP430 MCU。它们通过 4 针 SPI 连接,但我在 Linux 板上使用 GPIO 进行芯片选择。我所做的是使用轮询检测 GPIO 的下降沿(nr 52),然后执行 SPI 读取 ioctlread()

int main(void)
{

/********************************LINUX SCHEDULING**********************************/
sp.sched_priority = sched_get_priority_max(SCHED_FIFO); //scheduling
sched_setscheduler(0, SCHED_FIFO, &sp); //scheduling
/********************************LINUX SCHEDULING_END******************************/

struct pollfd fdset[2]; //declare the poll to be used in interrupt catching
int nfds = 2;
int gpio_fd, timeout, rc;
char *buf[MAX_BUF]; //max=64byte
int len;

initialize(); //gpio's are set to SPI_SLAVE
// spi_init();

gpio_fd = gpio_fd_open(CHIP_SELECT_PIN); //the CS(SS) pin is opened
timeout = POLL_TIMEOUT; //timeout 3 sec is set
// uint8_t voidFirstDetection = 1;

while (1) {
memset((void*)fdset, 0, sizeof(fdset));
fdset[0].fd = NULL;
fdset[0].events = POLLIN;
fdset[1].fd = gpio_fd;
fdset[1].events = POLLPRI;

/*** POLL starts to detect chipselects****/
rc = poll(fdset, nfds, timeout);

if (rc < 0) {
printf("\npoll() failed!\n");
return -1;
}

if (rc == 0) {
printf(".");
}

if (fdset[1].revents & POLLPRI ) { //HERE I need to run SPI_read
len = read(fdset[1].fd, buf, MAX_BUF);
/* if(voidFirstDetection){
voidFirstDetection = 0;
}else{*/
printf("\npoll() GPIO %d interrupt occurred\n", CHIP_SELECT_PIN);

int fd = open(device, O_RDWR);
if (fd < 0){
// snprintf(systemlogmsg, sizeof(systemlogmsg), "[1181]: errno:%s Cannot open /dev/spidev ", strerror(errno));
// error_logging(systemlogmsg, LOGLEVEL_ERROR);
printf("error spi recive\n");
}
//spi_transfer(fd);
do_read(fd);
close(fd);
// }
}

}

gpio_fd_close(gpio_fd);
return 0;
}

上面的代码工作正常,它只在信号的下降沿产生中断。当检测到中断时,我使用以下任一代码来读取 /dev/spidev1-0

static void do_read(int fd)
{
unsigned char buf[1], *bp;
int status;
int len = 1;

/* read at least 2 bytes, no more than 32 */
memset(buf, 0, sizeof buf);

status = read(fd, buf, len);
if (status < 0) {
perror("read");
return;
}
if (status != len) {
fprintf(stderr, "short read\n");
return;
}

printf("read(%2d, %2d): %02x %02x,", len, status,
buf[0], buf[1]);
status -= 2;
bp = buf + 2;
while (status-- > 0)
printf(" %02x", *bp++);
printf("\n");
}

static void spi_transfer(int fd)
{
int ret;
uint8_t tx[2];
uint8_t rx[3] = {0 };
struct spi_ioc_transfer tr = {
.tx_buf = 0,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};


ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1){
printf("can't send spi message");
exit(1);
}

for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
}

每当 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); 行在 spi_transfer()status = read(fd, buf , len); 执行 do_read() 时,我看到一个无限循环检测 GPIO52(芯片选择)上的中断。我尝试通过示波器观察 GPIO,但我看不到任何信号变化(这可能是我的示波器无法检测到的尖峰),但是,当我将芯片选择连接到 Vcc 时,它没有进入无限循环。由于我处于早期阶段,我将 MCU 的 GPIO 之一设置为输出并保持逻辑高电平。我使用 GPIO52(片选)作为输入,因为我的目的是将数据从 MCU 传输到 linux 板。

我想,read()ioctl 以某种方式影响 GPIO 吸收比 GPIO 可以提供的更多的电流。如果是问题所在,我该怎么做才能使 ioctl 或 read() 不会干扰 GPIO。或者您认为还有其他问题吗?

最佳答案

我很幸运,我很快就发现了问题。我把两 block 电路板都接地了,现在工作正常了。我会保留该帖子,因为其他人可能有同样的问题。但是我还是很好奇ioctl或者read是如何扰乱GPIO信号电平的

关于c - read()/ioctl 干扰 GPIO 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com