LS20031 + Edison - GPIO

Tips and questions relating to the GPS modules from SFE

Moderator: phalanx

Post Reply
ant.innit
Posts: 7
Joined: Wed Nov 12, 2014 9:21 am

LS20031 + Edison - GPIO

Post by ant.innit » Sun Feb 22, 2015 11:54 pm

Hi.

I've been trying to hookup a LS20031 GPS to the Sparkfun GPIO Block for Edison. So far the GPS is blinking so i guess its doing ok when it comes to power and getting a lock. But I'm getting stuck on the Edison side, my c code so far is looking like this:

Code: Select all


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <errno.h>

#include <mraa.h>

void* handling_uart(void *arg) {
	unsigned char rbuffer[256];
	int *uart0 = (int *)arg;

	errno = 0;
	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

	while(1) {
		pthread_testcancel();

		printf("going to try and read\n");
		read((*uart0), rbuffer, 256);
		memset(rbuffer, 0, 256);
		printf("\n read() %s\n", rbuffer);

		printf("read done. \r\n");
	}
}


int main(void) {
	mraa_uart_context uart_i;
	uart_i = mraa_uart_init(0);

	// not sure what mraa_uart_init is doing
	if(uart_i == NULL) {
		printf("failed to find uart\n");
	}

	int uart0 = -1;
	pthread_t thread;
	int ret, status;
	char serial_port[] = "/dev/ttyMFD1";

	uart0 = open(serial_port, O_RDWR, O_NONBLOCK);

	if(uart0 == -1) {
		printf("\n open() failed with error [%s]\n", strerror(errno));
		return -1;
	}

	struct termios options;
	tcgetattr(uart0, &options);

	cfsetispeed(&options, B57600);
	cfsetospeed(&options, B57600);

	options.c_cflag &= ~PARENB;
	options.c_cflag &= ~CSTOPB;
	options.c_cflag &= ~CSIZE;
	options.c_cflag |= CS8;

	options.c_cc[VTIME] = 0;
	options.c_cc[VMIN] = 0;
	options.c_lflag |= ICANON;

	tcflush(uart0, TCIFLUSH);
	tcsetattr(uart0, TCSANOW, &options);

	ret = pthread_create(&thread, NULL, handling_uart, &uart0);
	if(ret) {
		printf("\n pthread create failed with error [%s]\n", strerror(errno));
		return -1;
	}

	char c = getchar();
	status = pthread_cancel(thread);
	if(status) {
		printf("\n pthread cancel failed with error [%s]\n", strerror(errno));
		return -1;
	}

	close(uart0);

	return 0;
}

$ gcc -pthread -o uart uart.c -lmraa

I'm not sure if the serial is /dev/ttyMFD1, I have tried all the rest listed under ls /dev/tty*.
currently at a loss what i could be doing wrong.
it could all be wrong of course.

ant.innit
Posts: 7
Joined: Wed Nov 12, 2014 9:21 am

Re: LS20031 + Edison - GPIO

Post by ant.innit » Mon Feb 23, 2015 9:34 am

Just to expand a little regarding hookup, I have the GPIO 3.3v and GRD connected to the GPS, TX from GPS into RX on the GPIO.

I haven't set anything on the Edison system, /dev/tty shows nothing new.

ant.innit
Posts: 7
Joined: Wed Nov 12, 2014 9:21 am

Re: LS20031 + Edison - GPIO

Post by ant.innit » Tue Feb 24, 2015 10:34 pm

worked it out, need to enable the tx and rx pins.

bylos
Posts: 4
Joined: Mon Mar 02, 2015 2:09 pm

Re: LS20031 + Edison - GPIO

Post by bylos » Mon Mar 02, 2015 2:14 pm

Hi ant.innit,

I am also trying to use UART1 (ttyMFD1) from the Sparkfun GPIO block.
Data are successfully received on the RX pin, but when trying to write on port, TX pin stays at low level.
worked it out, need to enable the tx and rx pins.
Could you please be more specific ? I may have the same issue, but trying to play with /sys/kernel/debug/gpio_debug/gpio131 did not came to anything...

Thanks in advance,

Regards

bylos
Posts: 4
Joined: Mon Mar 02, 2015 2:09 pm

Re: LS20031 + Edison - GPIO

Post by bylos » Sat Mar 07, 2015 4:47 am

I finally found the cause of my issues for TX and RX pins of UART1 :
It seems that the level shifter on the GPIO block is broken for the TX pin, as I can verify that the input voltage (Edison side) is 1.8V but the output voltage (header side) is 0V.

Post Reply