* タイムスタンプ
*/
#define ADBUF_BYTE 3 // AD 1CH 1sample dataのbyte数
+#define ADBUF_LEN sizeof(ADbufType) // 1dataの長さ byte
typedef struct {
UbloxNavTimeUtc t; // タイムスタンプ
#define pps_intf_set() pps_intf = 1
#define pps_is_intf_enable() (pps_intf != 0)
+/**** SPI2 *********************************************/
+#define SPI2CSpin (PORTCbits.RC8)
+// SPI2 未送信データバイト数
+static int dataout_cnt;
+#define dataout_cnt_set(i) dataout_cnt = (i)
+#define dataout_cnt_get() dataout_cnt
+#define dataout_cnt_minus() (dataout_cnt--)
+/**** DRDY OUT ****************************************/
+#define DRDY_OUT PORTCbits.RC9
+/**** TEST *******************************************/
/*
* SPI FLAG test
*/
unsigned char txc = 0;
unsigned char rxc;
- spi2_int_disable();
- cnint_int_disable();
+// spi2_int_disable();
+// cnint_int_disable();
while(1) {
delay_ms(1000);
sprintf(sz, "SPI2STAT=%04X "
spi2_rx_overrun_clear();
break;
case 'x':
- SPI2STATbits.SRXMPT = 0;
+ SPI2STATbits.SPIEN = 0;
+ asm("nop");
+ SPI2STATbits.SPIEN = 1;
+ SPI2BUF;
break;
case 'y':
SPI2STATbits.SRXMPT = 1;
ad_cs_dis();
sts_set(STS_NOSYNC);
pps_intf_clear();
+ DRDY_OUT = 1;
// GPS UART1初期設定 BRGH=Standard mode
// 9600bps 8bit nonparity 1stop nonflowcnt.
spi2_init();
spi1_int_disable();
spi2_int_disable();
+ spi2_putc('$');
PDEBUG("START\r\n");
puts("START debug\r\n");
PDEBUG(sz);
sprintf(sz, "SPI1CON2=%04X\r\n", SPI1CON2);
PDEBUG(sz);
- sprintf(sz, "SPI1STAT=%04X\r\n", SPI1STAT);
+ sprintf(sz, "sizeof(ADBUF)=%d\r\n", ADBUF_LEN);
PDEBUG(sz);
// GPS UART1 受信割り込み許可
// DataOut SPI2 割り込み許可しない CSのCN INTで許可するので
spi2_intf_clear();
spi2_set_int_level(4);
-// spi2_int_enable();
// ChangeNotification INT許可 SPI2(Overo) CS
cnint_intf_clear();
cnint_int_enable();
/****!!!!!!!!!!!!!!!!!!!!!!!!*/
// test_spi_flag();
-test_spi_send();
+//test_spi_send();
while(1) {
// GPSから受信してデコード
// 時刻有効
sts_set(STS_SYNCNOW0);
}
- if (ring_read_get() != ring_write_get()) {
+ // DebugOutに1secデータ出力
+ if (ring_read2_get() != ring_write_get()) {
// タイムスタンプget
- gps = adbuf_time_get(ring_read_get());
+ gps = adbuf_time_get(ring_read2_get());
sprintf(sz, "%04u/%02d/%02d %02d:%02d:%02d.%09ld,%6lums,%6luns,%02X",
gps->year, gps->month, gps->day, gps->hour, gps->min, gps->sec, gps->nano,
gps->tow, gps->tacc, gps->valid
// AD data get
char ch;
long *lp;
- lp = adbuf_1sec_get(ring_read_get());
+ lp = adbuf_1sec_get(ring_read2_get());
for(ch=0; ch<AD_CHNUM; ch++) {
sprintf(sz, ",%+7ld", lp[ch]);
PDEBUG(sz);
}
PDEBUG("\r\n");
#endif
- ring_read_plus();
+ ring_read2_plus();
}
}
/*
adint_cnt = AD_SAMPLE - 1;
// ADバッファにタイムスタンプ付ける
- adbuf_time_write(ring_read_get(), &gpsNow);
+ adbuf_time_write(ring_write_get(), &gpsNow);
// AD START信号による同期
if (sts_get() == STS_SYNCNOW0) {
adint_cnt++;
if (adint_cnt >= AD_SAMPLE) {
// 1secぶんのデータgetした
- // 平均してバッファに書きこみ
+ // DRDY->H
+ DRDY_OUT = 1;
+ // 1sec平均する
char ch;
for(ch = 0; ch < AD_CHNUM; ch++) {
adint_add[ch] /= adint_cnt;
}
- // バッファに書きこみ
+ // 1secバッファに書きこみ
adbuf_1sec_write(ring_write_get(), adint_add);
// バッファ書き込み位置+1
ring_write_plus();
adint_cnt = 0;
+ // DRDY->L
+ DRDY_OUT = 0;
}
spi1_int_disable(); // SPI割り込みOFF
adint_sts = ADSTS_IDLE;
* TX FIFOに1byteの空きが出来ると発生
*/
static unsigned char spi2c;
-void __attribute__((interrupt, auto_psv)) _SPI2Interrupt(void)
+void __attribute__((interrupt, no_auto_psv)) _SPI2Interrupt(void)
{
unsigned char rx;
static unsigned int txlen = 512;
+
spi2_intf_clear();
-#if 1
+#if 0
// static unsigned char c=0;
while(!spi2_tx_fifo_is_full())
spi2_putc(spi2c++);
// if (rx == '$') c = 0;
}
#endif
+ // 送信
+ while(SPI2_TBF == 0) {
+ if (dataout_cnt_get() <= 0) break;
+ spi2_putc(spi2c++);
+ dataout_cnt_minus();
+ }
+ // 受信
+ while(SPI2_SRXMPT == 0) {
+ rx = spi2_getc();
+ }
+
#if 0
//spi2c = 123;
// RX FIFOから読み出し
* Interrupt Handler
*
*/
-#define SPI2CSpin (PORTCbits.RC8)
-void __attribute__((interrupt, auto_psv)) _CNInterrupt(void)
+void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void)
{
cnint_intf_clear();
if (SPI2CSpin == 1) {
// CS=H
// SPI2割り込みOFF
spi2_int_disable();
-
+ // SPI2をリセットしてTX/RX FIFOクリア
+ SPI2STATbits.SPIEN = 0;
+ asm("nop");
+ SPI2STATbits.SPIEN = 1;
+ asm("nop");
+ SPI2BUF; // RBF->0
+ // $->TX FIFO
+ spi2_putc('$');
+ // リングバッファ読み込み位置+1
+
} else {
// CS=L
- // SPI送信の一番最初なので
- spi2c = 0;
-
-// SPI2 RX FIFOクリア
-// SPI2 TX FIFOクリア
-// リングバッファ読み込み位置get?
-// SPI2 TX FIFOに送信データ書き込み?
+ // リングバッファ読み込み位置get?
+
+ // SPI送信の一番最初なので
+ spi2c = 0;
+ dataout_cnt_set(ADBUF_LEN);
+ // SPI2 TX FIFOに送信データ書き込み
+ while(SPI2_TBF == 0) {
+ if (dataout_cnt_get() <= 0) break;
+ spi2_putc(spi2c++);
+ dataout_cnt_minus();
+ }
// SPI2割り込みON
spi2_int_enable();
}
#define spi1_rx_overrun_clear() SPI1STATbits.SPIROV = 0;
#define spi1_putc(c) SPI1BUF = (c & 0xFF)
-#define spi1_getc() (SPI1BUF & 0xFF)
+#define spi1_getc() (SPI1BUF & 0xFF)
#define spi1_set_int_level(i) IPC2bits.SPI1IP = (i)
#define spi1_int_enable() IEC0bits.SPI1IE = 1
#define spi1_int_disable() IEC0bits.SPI1IE = 0
#define spi1_intf_clear() IFS0bits.SPI1IF = 0
+#define SPI2_SRXMPT SPI2STATbits.SRXMPT
+#define SPI2_TBF SPI2STATbits.SPITBF
+#define SPI2_RBF SPI2STATbits.SPITBF
#define spi2_tx_fifo_is_full() (SPI2STATbits.SPITBF == 1) // true=full
#define spi2_rx_fifo_is_full() (SPI2STATbits.SPIRBF == 1) // true=full
#define spi2_rx_fifo_is_empty() (SPI2STATbits.SRXMPT == 1) // true=empty
read位置
*/
unsigned char r_write;
-unsigned char r_read;
+unsigned char r_read1;
+unsigned char r_read2;
unsigned char r_num;
/*
void ring_init(void)
{
r_write = 0;
- r_read = 0;
+ r_read1 = 0;
+ r_read2 = 0;
r_num = RING_NUM;
}
/*
読み出し位置
*/
-void ring_read_set(unsigned char i)
+void ring_read1_set(unsigned char i)
{
- r_read = i;
+ r_read1 = i;
}
-void ring_read_plus(void)
+void ring_read1_plus(void)
{
- r_read++;
- if (r_read >= r_num) r_read = 0;
+ r_read1++;
+ if (r_read1 >= r_num) r_read1 = 0;
+}
+void ring_read2_set(unsigned char i)
+{
+ r_read2 = i;
+}
+void ring_read2_plus(void)
+{
+ r_read2++;
+ if (r_read2 >= r_num) r_read2 = 0;
}
// 読み込んでいないデータ数
-unsigned char ring_num_get()
+unsigned char ring_num1_get()
{
signed char i;
- i = (signed char)r_write - (signed char)r_read;
+ i = (signed char)r_write - (signed char)r_read1;
if (i < 0) i += r_num;
return (unsigned char)i;
}
+unsigned char ring_num2_get()
+{
+ signed char i;
+
+ i = (signed char)r_write - (signed char)r_read2;
+ if (i < 0) i += r_num;
+ return (unsigned char)i;
+}
/*
パケットバッファフル?
1=Full
0=not Full
*/
-unsigned char ring_is_full(void)
+unsigned char ring_is_full1(void)
+{
+ if (ring_num1_get() >= r_num - 1) return 1;
+ return 0;
+}
+unsigned char ring_is_full2(void)
{
- if (ring_num_get() >= r_num - 1) return 1;
+ if (ring_num2_get() >= r_num - 1) return 1;
return 0;
}
#define RING_NUM 6
extern unsigned char r_write;
-extern unsigned char r_read;
+extern unsigned char r_read1;
+extern unsigned char r_read2;
extern unsigned char r_num;
#define ring_clear() ring_read_set(ring_write_get(t))
void ring_init(void);
-//読み出し位置
-#define ring_read_get() r_read
-void ring_read_set(unsigned char i);
-void ring_read_plus(void);
+//読み出し位置1
+#define ring_read1_get() r_read1
+void ring_read1_set(unsigned char i);
+void ring_read1_plus(void);
+
+//読み出し位置2
+#define ring_read2_get() r_read2
+void ring_read2_set(unsigned char i);
+void ring_read2_plus(void);
// 書き込み位置
#define ring_write_get() r_write
if (r_write >= r_num) r_write = 0;
}
-unsigned char ring_num_get();
-unsigned char ring_is_full(void);
+unsigned char ring_num1_get();
+unsigned char ring_is_full1(void);
+
+unsigned char ring_num2_get();
+unsigned char ring_is_full2(void);
#endif