void UART0_initTxPolling() { DECL_PAGE; SET_PAGE(0x00); SCON0_TI = 1; RESTORE_PAGE; }
void UART0_write(uint8_t value) { DECL_PAGE; SET_PAGE(0x00); SBUF0 = value; RESTORE_PAGE; }
void UART0_initStdio() { DECL_PAGE; SET_PAGE(0x00); SCON0 |= SCON0_REN__RECEIVE_ENABLED | SCON0_TI__SET; RESTORE_PAGE; }
void UART0_clearIntFlag(uint8_t flag) { DECL_PAGE; SET_PAGE(0x00); SCON0 &= ~(flag); RESTORE_PAGE; }
void UART0_writeWithExtraBit(uint16_t value) { DECL_PAGE; SET_PAGE(0x00); SCON0_TB8 = value >> 8; SBUF0 = value; RESTORE_PAGE; }
uint16_t UART0_readWithExtraBit(void) { uint16_t val; DECL_PAGE; SET_PAGE(0x00); val = (SBUF0 | ((SCON0 & SCON0_RB8__BMASK) << 6) ); RESTORE_PAGE; return val; }
uint8_t UART0_read(void) { uint8_t val; DECL_PAGE; SET_PAGE(0x00); val = SBUF0; RESTORE_PAGE; return val; }
uint8_t UART0_getIntFlags() { uint8_t val; DECL_PAGE; SET_PAGE(0x00); val = SCON0 & (UART0_TX_IF | UART0_RX_IF); RESTORE_PAGE; return val; }
char putchar(char c){ DECL_PAGE; SET_PAGE(0x00); while(!SCON0_TI); SBUF0 = c; SCON0_TI = 0; RESTORE_PAGE; return c; }
void UART0_init(UART0_RxEnable_t rxen, UART0_Width_t width, UART0_Multiproc_t mce) { DECL_PAGE; SET_PAGE(0x00); SCON0 &= ~(SCON0_SMODE__BMASK | SCON0_MCE__BMASK | SCON0_REN__BMASK); SCON0 = mce | rxen | width; RESTORE_PAGE; }
char _getkey(){ char val; DECL_PAGE; SET_PAGE(0x00); while(!SCON0_RI); SCON0_RI = 0; val = SBUF0; RESTORE_PAGE; return val; }
void UART0_reset() { DECL_PAGE; SET_PAGE(0x00); SCON0 = SCON0_SMODE__8_BIT | SCON0_MCE__MULTI_DISABLED | SCON0_REN__RECEIVE_DISABLED | SCON0_TB8__NOT_SET | SCON0_RB8__NOT_SET | SCON0_TI__NOT_SET | SCON0_RI__NOT_SET; RESTORE_PAGE; }
void UART0_writeBuffer(SI_VARIABLE_SEGMENT_POINTER(buffer, uint8_t, EFM8PDL_UART0_TX_BUFTYPE), uint8_t length) { DECL_PAGE; SET_PAGE(0x00); //Init internal data txBuffer = buffer+1; txRemaining = length-1; //Send initial byte SBUF0 = *buffer; RESTORE_PAGE; }
// Save captured track uint8_t sdc_save_track(void) { FRESULT res; BYTE page, i, r = SDCS_OK; UINT bw, tbw; long bytesleft, trklen_old, addr; // fill header struct FDR_HDR.sig[0] = 'F'; FDR_HDR.sig[1] = 'D'; FDR_HDR.sig[2] = 'R'; FDR_HDR.sig[3] = '0'; FDR_HDR.smprate = smp_rates[FDR_INFO.smprate]; FDR_HDR.track = FDR_INFO.track; FDR_HDR.side = FDR_INFO.side; FDR_HDR.revs = FDR_INFO.revs; // fill trklens // hack: DMA puts data by words but lengths are snapshoted in bytes. // we have to correct total length to an even value. if(FDR_INFO.trklen[FDR_INFO.revs-1] == FDR_INFO.trklen[FDR_INFO.revs]) { // no data in tail - correct also last rev length FDR_INFO.trklen[FDR_INFO.revs-1] &= ~1; } FDR_INFO.trklen[FDR_INFO.revs] &= ~1; trklen_old = 0; for(i=0; i<=FDR_INFO.revs; i++) //revs+1 for tail { addr = FDR_INFO.trklen[i]; // hack: if the whole buffer was filled with the data, // trimmed to 0x00000 address was returned, so fix it. if(addr==0) addr=0x80000; trklen[i] = addr - trklen_old; trklen_old = addr; } bytesleft = FDR_INFO.trklen[FDR_INFO.revs]; // hack: if the whole buffer was filled with the data, // trimmed to 0x00000 address was returned, so fix it. if(bytesleft==0) bytesleft=0x80000; // open file if (!FDR_INFO.single_file) { res=open_file(); if (res==FR_EXIST) return SDCS_EXIST; else if (res!=FR_OK) return SDCS_OPEN_ERR; } // write header res=f_write(&fd, &FDR_HDR, sizeof(FDR_HDR), &bw); if (res!=FR_OK) { r = SDCS_WRITE_ERR; goto exit; } res=f_write(&fd, trklen, sizeof(trklen[0])*(FDR_INFO.revs+1), &bw); if (res!=FR_OK) { r = SDCS_WRITE_ERR; goto exit; } // save data page=DATA_START_PAGE; while(bytesleft) { if (bytesleft > PAGE_SIZE) tbw = PAGE_SIZE; else tbw = bytesleft; SET_PAGE(page); res=f_write(&fd, PAGE_START, tbw, &bw); if (res!=FR_OK || bw!=tbw) { r = SDCS_WRITE_ERR; break; } // exit at break if(is_break_pressed()) { r = SDCS_BREAK; break; } page++; bytesleft -= tbw; fdd_keep_alive(); // keep motor on } exit: // close file if (!FDR_INFO.single_file) f_close(&fd); // restore default page SET_PAGE(PAGE_DEFAULT); return r; }