OSDN Git Service

ring.c read pointer no.2 add
authorNaoya Takamura <ntaka206@users.sourceforge.jp>
Wed, 7 Dec 2011 09:07:06 +0000 (18:07 +0900)
committerNaoya Takamura <ntaka206@users.sourceforge.jp>
Wed, 7 Dec 2011 09:07:06 +0000 (18:07 +0900)
main.c spi2 fifo handling

main.c
myspi.h
myuart.c
ring.c
ring.h

diff --git a/main.c b/main.c
index 7dd2fe1..5a86cec 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,6 +43,7 @@ _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2 )
  * タイムスタンプ
  */
 #define ADBUF_BYTE  3   // AD 1CH 1sample dataのbyte数
+#define ADBUF_LEN   sizeof(ADbufType)   // 1dataの長さ byte
 
 typedef struct {
     UbloxNavTimeUtc t;  // タイムスタンプ
@@ -180,6 +181,16 @@ static char pps_intf;
 #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
  */
@@ -190,8 +201,8 @@ void test_spi_flag(void)
     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 "
@@ -224,7 +235,10 @@ void test_spi_flag(void)
                     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;
@@ -341,6 +355,7 @@ int main(int argc, char** argv) {
     ad_cs_dis();
     sts_set(STS_NOSYNC);
     pps_intf_clear();
+    DRDY_OUT = 1;
     
     // GPS UART1初期設定 BRGH=Standard mode
     // 9600bps 8bit nonparity 1stop nonflowcnt.
@@ -361,6 +376,7 @@ int main(int argc, char** argv) {
     spi2_init();
     spi1_int_disable();
     spi2_int_disable();
+    spi2_putc('$');
 
     PDEBUG("START\r\n");
     puts("START debug\r\n");
@@ -370,7 +386,7 @@ int main(int argc, char** argv) {
     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 受信割り込み許可
@@ -425,13 +441,12 @@ int main(int argc, char** argv) {
     // 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から受信してデコード
@@ -440,9 +455,10 @@ test_spi_send();
             // 時刻有効
             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
@@ -453,14 +469,14 @@ test_spi_send();
             // 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();
         }
     }
 /*
@@ -502,7 +518,7 @@ void __attribute__((interrupt, no_auto_psv)) _INT0Interrupt(void)
     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) {
@@ -595,16 +611,20 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
                 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;
@@ -630,12 +650,13 @@ void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void)
  * 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++);
@@ -644,6 +665,17 @@ void __attribute__((interrupt, auto_psv)) _SPI2Interrupt(void)
 //        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から読み出し
@@ -676,24 +708,36 @@ void __attribute__((interrupt, auto_psv)) _SPI2Interrupt(void)
  * 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();
     }
diff --git a/myspi.h b/myspi.h
index 27772d5..188c9bd 100644 (file)
--- a/myspi.h
+++ b/myspi.h
@@ -11,13 +11,16 @@ int spi2_init(void);
 #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
index 7f15b61..dc1c338 100644 (file)
--- a/myuart.c
+++ b/myuart.c
@@ -1,7 +1,7 @@
 #include <p24FJ64GA004.h>
 #include "myuart.h"
 
-// ublox GPS受信用リングバッファ
+// UART1 ublox GPS受信用リングバッファ
 static unsigned char   ubx_w, ubx_r;
 static unsigned char    ubx_buf[256];
 
diff --git a/ring.c b/ring.c
index e2eeb6e..41d88c8 100644 (file)
--- a/ring.c
+++ b/ring.c
@@ -6,7 +6,8 @@
        read位置
 */
 unsigned char  r_write;
-unsigned char   r_read;
+unsigned char   r_read1;
+unsigned char   r_read2;
 unsigned char  r_num;
 
 /*
@@ -14,39 +15,62 @@ 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;
 }
diff --git a/ring.h b/ring.h
index bdcf379..169d3a8 100644 (file)
--- a/ring.h
+++ b/ring.h
@@ -6,17 +6,23 @@
 #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
@@ -26,8 +32,11 @@ inline extern void ring_write_plus(void)
     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