GPS ublox-6 neo6 使用 SPI 与微控制器通信
GPS ublox-6 neo6 communication with Microcontroller using SPI
我正在使用 GPS 模块 ublox-6 neo6 并尝试使用 SPI 从 pic32 微控制器中提取数据。我正在使用 GPIO 引脚来执行此操作,因此 SPI 库已关闭 table.
显然,我需要做的就是向它发送0xFF,同时读取返回的内容以获取数据。当我自己尝试对它进行位撞击时,我发送了 0xFF,但我从 GPS 收到的全部都是 0xFF。
我也尝试过实现 SoftSPI 库,因为我担心我尝试发送和接收信息的速度太快,但类似地,当我发送 0xFF 时,我仍然从 GPS 返回 0xFF。
这是我的 bit-banging 代码:
#include <plib.h>
#include <Math.h>
#include <p32xxxx.h>
void setup() {
pinMode( RB05_GPSmosi, OUTPUT );
pinMode( RB02_GPSmiso, INPUT );
pinMode( RB03_GPSsclk, OUTPUT );
pinMode( RB04_GPScs , OUTPUT );
digitalWrite( RB04_GPScs, 1 );
digitalWrite( RB03_GPSsclk, 0 );
}
void loop() {
gpsHit();
}
void gpsHit() {
char received = 0;
digitalWrite(RB04_GPScs, LOW);
int i = 0;
for(i = 0; i < 8; i++) {
digitalWrite(RB05_GPSmosi, ((0xFF >> (7-i)) & 0x01));
digitalWrite(RB03_GPSsclk, 1);
received |= digitalRead(RB02_GPSmiso) << (7-i);
digitalWrite(RB03_GPSsclk, 0);
}
if((received & 0xFF) != 0xFF)
Serial.println(received);
digitalWrite(RB04_GPScs, HIGH);
}
现在是 SoftSPI 代码:
#include <SoftSPI.h>
#include <Math.h>
#include <p32xxxx.h>
#define RB05_GPSmosi 21
#define RB04_GPScs 15
#define RB03_GPSsclk 20
#define RB02_GPSmiso 14
uint8_t recBuf[80];
SoftSPI gps;
void setup() {
Serial.begin(9600);
gps.begin(RB04_GPScs, RB05_GPSmosi, RB02_GPSmiso, RB03_GPSsclk);
gps.setSpeed(80000);
gps.setDirection(SSPI_SHIFT_LEFT);
gps.setDelay(10);
//Reset gps
sendReset();
}
void loop() {
int i = 0;
for(i = 0; i < 80; i++) {
Serial.print((char) recBuf[i]);
recBuf[i] = 0;
}
Serial.println();
gps.setSelect(LOW);
gps.transfer(80, 0xFF, recBuf);
gps.setSelect(HIGH);
}
在这两种情况下,每当我尝试发送 0xFF 时,我都会收到 0xFF。有趣的是,当我向它发送不是 0xFF 的垃圾时,我收到了实际的 NMEA 字符串,但是这些 NMEA 字符串中没有实际数据,它看起来像:
$GPGLL,V*32
$GPGSA,A*49
等..
^这些例子只是从记忆中提取的,所以可能与我要找的不完全一样,但非常相似。
知道是什么导致了这个问题吗?该设备的数据表只是说,如果您没有任何实际要发送的内容,请发送 0xFF,然后读取您返回的数据。我已尝试通过向设备发送 UBX 代码将设备重置为出厂默认设置,但这根本没有帮助。
如有任何建议或信息,我们将不胜感激。
所以我没有使用 SPI,而是使用 UART 来实现我的 Ublox LEA6T。但是我可以说,如果没有天线或 GPS 接收器没有信号,您收到的 NEMA 看起来是有效的。如果您 post 您的实际 SPI digitalWrite 代码,我可能会提供更多帮助。您是否可以使用逻辑分析仪或示波器来探测线路?
我正在使用 GPS 模块 ublox-6 neo6 并尝试使用 SPI 从 pic32 微控制器中提取数据。我正在使用 GPIO 引脚来执行此操作,因此 SPI 库已关闭 table.
显然,我需要做的就是向它发送0xFF,同时读取返回的内容以获取数据。当我自己尝试对它进行位撞击时,我发送了 0xFF,但我从 GPS 收到的全部都是 0xFF。
我也尝试过实现 SoftSPI 库,因为我担心我尝试发送和接收信息的速度太快,但类似地,当我发送 0xFF 时,我仍然从 GPS 返回 0xFF。
这是我的 bit-banging 代码:
#include <plib.h>
#include <Math.h>
#include <p32xxxx.h>
void setup() {
pinMode( RB05_GPSmosi, OUTPUT );
pinMode( RB02_GPSmiso, INPUT );
pinMode( RB03_GPSsclk, OUTPUT );
pinMode( RB04_GPScs , OUTPUT );
digitalWrite( RB04_GPScs, 1 );
digitalWrite( RB03_GPSsclk, 0 );
}
void loop() {
gpsHit();
}
void gpsHit() {
char received = 0;
digitalWrite(RB04_GPScs, LOW);
int i = 0;
for(i = 0; i < 8; i++) {
digitalWrite(RB05_GPSmosi, ((0xFF >> (7-i)) & 0x01));
digitalWrite(RB03_GPSsclk, 1);
received |= digitalRead(RB02_GPSmiso) << (7-i);
digitalWrite(RB03_GPSsclk, 0);
}
if((received & 0xFF) != 0xFF)
Serial.println(received);
digitalWrite(RB04_GPScs, HIGH);
}
现在是 SoftSPI 代码:
#include <SoftSPI.h>
#include <Math.h>
#include <p32xxxx.h>
#define RB05_GPSmosi 21
#define RB04_GPScs 15
#define RB03_GPSsclk 20
#define RB02_GPSmiso 14
uint8_t recBuf[80];
SoftSPI gps;
void setup() {
Serial.begin(9600);
gps.begin(RB04_GPScs, RB05_GPSmosi, RB02_GPSmiso, RB03_GPSsclk);
gps.setSpeed(80000);
gps.setDirection(SSPI_SHIFT_LEFT);
gps.setDelay(10);
//Reset gps
sendReset();
}
void loop() {
int i = 0;
for(i = 0; i < 80; i++) {
Serial.print((char) recBuf[i]);
recBuf[i] = 0;
}
Serial.println();
gps.setSelect(LOW);
gps.transfer(80, 0xFF, recBuf);
gps.setSelect(HIGH);
}
在这两种情况下,每当我尝试发送 0xFF 时,我都会收到 0xFF。有趣的是,当我向它发送不是 0xFF 的垃圾时,我收到了实际的 NMEA 字符串,但是这些 NMEA 字符串中没有实际数据,它看起来像:
$GPGLL,V*32
$GPGSA,A*49
等..
^这些例子只是从记忆中提取的,所以可能与我要找的不完全一样,但非常相似。
知道是什么导致了这个问题吗?该设备的数据表只是说,如果您没有任何实际要发送的内容,请发送 0xFF,然后读取您返回的数据。我已尝试通过向设备发送 UBX 代码将设备重置为出厂默认设置,但这根本没有帮助。
如有任何建议或信息,我们将不胜感激。
所以我没有使用 SPI,而是使用 UART 来实现我的 Ublox LEA6T。但是我可以说,如果没有天线或 GPS 接收器没有信号,您收到的 NEMA 看起来是有效的。如果您 post 您的实际 SPI digitalWrite 代码,我可能会提供更多帮助。您是否可以使用逻辑分析仪或示波器来探测线路?