Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Modul 1: Konsep I/O pada NUC1XX series Tujuan Memahami konsep Luaran/Masukan (I/O) pada mikrokontroler ARM Cortex M0 NuMicro 1XX Series (NUC140VE3C ( NUC140VE3CN) N)
Pendahuluan NUC1XX series adalah ARM ® Cortex ™-mikrokontroler ™ -mikrokontroler dengan M0 core didalamnya yang cocok digunakan untuk kontrol industri dan aplikasi yang membutuhkan fungsi komunikasi khusus. khusus . Cortex ™-M0 ™-M0 adalah prosesor ARM terbaru dengan kinerja 32-bit dengan biaya yang setara dengan mikrokontroler 8-bit. NuMicro Seri NUC100 memiliki inti ARM Cortex M0 yang tertanam dengan kecepatan hingga 50 MHz, dilengkapi dengan memori flash untuk program 32K/64K/128Kbyte., SRAM sebesar 4K/8K/16K-byte dan memori flash loader untuk ISP ( In System Programming ) sebesar 4K-byte. Selain itu juga dilengkapi dengan berbagai macam periferal, seperti GPIO, Timer, Watchdog Timer, RTC, PDMA, UART, SPI/MICROWIRE, I2C, I2S, PWM, LIN, CAN, PS2, USB 2.0 FS Device, ADC 12-bit, komparator analog, Low Voltage Reset dan Brown-out Detector . Gambar 1 menunjukkan diagram blok dari NuMicro NUC130/140 Series.
Gambar 1. Diagram Blok NuMicro NUC130/140 Series
NUC140 Learning Board Board ini menggunakan catudaya 5V, yang dapat diperoleh dari konektor USB ataupun melalui konektor catudaya adaptor. Tegangan ini langsung menjadi VDD untuk chip
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
NUC140VE3CN, NUC140VE3CN, sehingga perlu diperhatikan tegangan input ini maksimal adalah 5.5V (menurut datasheet NUC140). Pada board terdapat juga catudaya teregulasi 3.3V menggunakan chip LM1117. Tipe chip regulator ini tidak dinyatakan dalam skematik. Tegangan dari Powerjack 3 pin dan konektor USB dilewatkan melalui dioda sehingga aman dari kesalahan polaritas pemasangan, namun tidak melindungi dari kerusakan jika tegangan masuk melebihi 5.5V. Gambar 1 menunjukkan layout NUC140 Learning Board. Sedangkan Tabel 1 menunjukkan penggunaan pin pada Learning Board tsb.
Gambar 1. Layout NUC140 Learning Board dari Nuvoton Tabel 1. Konfigurasi Sistem pada NuMicro 1XX series Development Board Blok ICE Bridge Nu-Link
UART Pushbutton GPB15 CAN
Pin ICE_CLK ICE_DATA GPB0 GPB1 GPB15 GPD6 GPD7 GPB12-13
Fungsi Antarmuka SWD
Rx UART0 Tx UART0 INT0 Rx CAN0 Tx CAN0 CAN transceiver speed
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Blok WAU8822 Codec
LIN
7-Seg LED LCD Panel Dot Matrix
Potensiometer Buzzer Keypad matrix Reset EEPROM Slot SD card
Flash
LED
Pin GPC0 GPC1 GPC2 GPC3 GPA15 GPA8 GPA9 GPE14 GPE15 GPB4 GPB5 GPB6 GPB7 GPE0-7 GPC4-7 GPD8 GPD9 GPD10 GPD11 GPD14 GPA7 GPB11 GPA0-5 RESET GPA10 GPA11 GPD12 GPD13 GPC8-11 GPD0 GPD1 GPD2 GPD3 GPD4 GPD5 GPA12 GPA13 GPA14 GPC12-15
Fungsi I2SLRCLK I2SBCLK I2SDI I2SDO I2SMCLK I2C0 SDA I2C0 SCL Line out Enable/Disable Line in Enable/Disable Rx UART1 Tx UART1 LIN transceiver wakeup LIN transc. Enable/Disable Baris Kolom SPI3 SS30 SPI3 SPCLK SPI3 MISO0 SPI3 MOSI0 Lampu latar LCD Antarmuka ADC PWM4 GPIO Reset I2C1 SDA I2C1 SCL Catudaya SD card Deteksi SD card Antarmuka SD card SPI2 SS20 SPI2 SPCLK SPI2 MISO0 SPI2 MOSI0 SPI2 MISO1 SPI2 MOSI1 PWM0 PWM1 PWM2 GPIO
Perangkat Lunak Kompilasi Untuk membuat sebuah proyek aplikasi menggunakan ARM® Cortex™-M0 Cortex™ -M0 dari NuMicro Nuvoton NUC1XX NUC1XX series, dapat digunakan CooCox IDE. IDE. Berikut langkah yang digunakan dalam membuat sebuah project baru dengan menggunakan CooCox IDE:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
1. Klik menu Project New Project lalu tulis nama proyek aplikasi yang akan dibuat dan tentukan lokasi penyimpanan project tersebut. Setelah itu klik finish ; 2. Lalu klik Nuvoton dan pilih jenis mikrokontroler NUC140VE3CN ; 3. Kemudian akan muncul jendela repository . Pada bagian ini dapat dipilih pustaka components yang akan digunakan; 4. Kemudian buka file main.c pada bagian jendela project. Pada main.c inilah dapat ditulis kode program yang akan digunakan pada mikrokontroler Nuvoton; 5. Untuk mengkompile program klik menu Project
build atau tekan F7;
6. Untuk mendownload program yang telah ditulis, klik Flash
Program Download .
Latihan 1. Menyalakan LED Pada NuMicro Development Board tersedia LED yang terhubung pada GPCC12 sampai GPC15. Pada program untuk menyalakan LED digunakan fungsi DrvGPIO_SetPortBits untuk membuat port GPIO bernilai HIGH dan LOW tertentu pada bit-bitnya. Untuk membuat program, klik panel repository lalu pilih M0 Cmsis Core, Cmsis Boot, System definition, SYS, dan GPIO. Lalu ketik listing program berikut: #include "DrvSYS.h" #include "DrvGPIO.h" void delay_loop(void ) { uint32_t i,j; for(i=0;i<4;i++) { for(j=0;j<60000;j++); } } ) int main(void { int i=0; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl( E_SYS_XTL12M , 1); /* Waiting for 12M Xtal stable */ //SysTimerDelay(5000); DrvSYS_Delay(5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); /*lock the protected registers */ LOCKREG(); DrvSYS_SetClockDivider( E_SYS_HCLK_DIV , 0);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
/* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
for(i=12;i<16;i++) { DrvGPIO_Open( E_GPC , i, E_IO_OUTPUT ); /* set all GPA12-15 as OUTPUT */ } while(1) { DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); DrvGPIO_SetPortBits( E_GPC , delay_loop(); }
0xF000); 0xE000); 0xD000); 0xC000); 0xB000); 0xA000); 0x9000); 0x8000); 0x7000); 0x6000); 0x5000); 0x4000); 0x3000); 0x2000); 0x1000); 0x0000);
}
Latihan 2. Menyalakan LED RGB Pada latihan kedua akan dibuat program untuk menyalakan LED RGB yang tersedia pada port GPA12-14. Gambar 2 menunjukkan konfigurasi LED RGB yang terdapat pada NuMicro 1xx Series :
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Gambar 2. Konfigurasi RGB LED pada NuMicro 1XX series Development Board Buatlah program untuk menyalakan LED RGB tersebut dengan menuliskan listing program berikut pada program utama yang telah anda buat pada latihan 1. DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop(); DrvGPIO_SetPortBits(E_GPA, delay_loop();
0x0000); 0x1000); 0x2000); 0x3000); 0x4000); 0x5000); 0x6000); 0x7000);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Modul 2: Seven Segment Tujuan Memahami konsep Input Output yang digunakan pada Seven Segment yang terdapat di NuMicro 1XX Series Development Board
Pendahuluan Pada NuMicro 1XX series development board terdapat 4 buah Seven Segment yang terdapat pada PORT GPE.0-7 sebagai Row dan GPC.4-7 sebagai column. Untuk menggunakan Seven Segment ini, pengguna perlu memasukkan Seven_Segment.h dan Seven_Segment.c kedalam program. Pada program, pengguna dapat menggunakan syntax “ show_seven_segment(column,row) untuk menampilkan karakter pada Seven Segment. Karena Seven Segment tersebut terhubung dengan Multiplexer terlebih dahulu sebelum masuk ke mikrokontroler, maka pengguna harus mematikan Multiplexer terlebih dahulu sebelum memulai perintah selanjutnya dengan syntax close_seven_segment() Gambar 3 berikut ini menunjukkan konfigurasi Seven Segment pada NuMicro 1XX series: ”
Latihan-1: Lengkapi listing program dibawah ini void delay_loop(void) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } int main(void) { int i=0,j=0; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); /* Waiting for 12M Xtal stalble */ DrvSYS_Delay(5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); /*lock the protected registers */ LOCKREG(); DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
while(1) { for(i=0;i<9;i++) { for(j=0;j<4;j++) { show_seven_segment(j,i); delay_loop(); } } } }
Gambar 3
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Modul 3. Penggunaan LCD Tujuan -
Praktikan memahami penggunaan LCD pada mikrokontroler ARM Cortex M0 NuMicro 1XX Series
Pada development board NUC 1XX series terdapat sebuah DOT MATRIX LCD Pannel Gambar 3 berikut konfigurasi dari LCD tersebut:
Gambar 3. Konfigurasi Dot Matrix LCD NuMicro 1XX series Development Board
Latihan-1: Contoh program antarmuka LCD Untuk menggunakan LCD tersebut, pengguna perlu memanggil sebuah library, yaitu: LCD_Driver.h. Untuk menambahkan library tersebut, klik menu Project>>Configuration. Lalu pada bagian include path tambahkan library LCD_Driver.h dengan cara mengarahkannya ke folder tempat library tersebut disimpan. Kemudian tambahkan file LCD_Driver.c dan Ascii_Table.c pada bagian project dengan cara klik kanan folder nama project anda lalu add linked file. Kemudian masukkan file-file tersebut.
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Setelah semua file dan library tersebut dimasukkan, tuliskan listing program berikut pada main.c
#include "NUC1xx.h" #include "DrvSYS.h" #include "DrvGPIO.h" #include "LCD_Driver.h" void delay_loop(void ) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } void delays() { delay_loop(); delay_loop(); delay_loop(); } int main(void ) { //int i=0,j=0; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl( E_SYS_XTL12M , 1); /* Waiting for 12M Xtal stalble */ //SysTimerDelay(5000); DrvSYS_Delay(5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); /*lock the protected registers */ LOCKREG(); DrvSYS_SetClockDivider( E_SYS_HCLK_DIV , 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
Initial_pannel (); clr_all_pannal ();
//call initial pannel function
(0, "LCD TEST"); print_lcd print_lcd (1, " ARM M0 Nuvoton "); delays(); clr_all_pannal (); DrvGPIO_ClrBit( E_GPD ,14); // backlight ON - comment this to turn OFF
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
while(1) { if (DrvGPIO_GetBit(E_GPB, 15)==0) { clr_all_pannal (); (0, "Button Test.. "); print_lcd print_lcd (1, "OK....."); print_lcd (2, "ELINS * 2012 Yes"); } else {
clr_all_pannal (); print_lcd (1, "Tekan Button..."); } } }
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Modul 4: Penggunaan Keypad Matrix 3x3 Tujuan -
Praktikan memahami penggunaan keypad matrix 3x3 pada NuMicro 1XX Series Development Board
Pada development board NUC 1XX series, terdapat keypad matrix 3x3. Gambar 4 berikut skematik rangkaian dari keypad matrix tersebut:
Gambar 4. Konfigurasi Keypad Matrix 3x3 NuMicro 1XX series Development Board Untuk menggunakannya, pertama-tama masukkan library ScanKey.h dan file ScanKey.c. Pengguna dapat memanggil fungsi scankey() saat akan menggunakan keypad matrix tersebut Contoh program: temp=scan_key(); if(temp==1) { print_lcd(0,"Key1 had pressed "); }
Pada program diatas, akan ditampilkan tombol yang telah ditekan pada LCD.
Latihan-1: Lengkapi listing program dibawah ini 1. Lengkapi program diatas untuk keypad 1-9 kemudian downloadkan pada mikrokontroler 2. Buatlah program yang menampilkan di LCD setiap keypad yang ditekan tanpa menghapus hasil penekanan sebelumnya
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
MODUL 5: ADC Tujuan -
Praktikan memahami penggunaan ADC pada NuMicro 1XX Series Development Board dengan menggunakan CoCoox IDE
Pada NuMicro 1XX series terdapat variable resistor yang terhubung dengan port ADC dengan resolusi 12bit pada GPA.7 Gambar 5 berikut ini merupakan konfigurasi ADC pada NuMicro 1XX series Development Board
Gambar 5. Konfigurasi ADC pada NuMicro 1XX series Development Board
Berikut program yang digunakan untuk menginisialisasi fungsi ADC pada NuMicro 1XX series: void InitADC(void ) { /* Step 1. GPIO initial */ GPIOA->OFFD|=0x00800000; SYS->GPAMFP.ADC7_SS21_AD6=1;
//Disable digital input path //Set ADC function
/* Step 2. Enable and Select ADC clock source, and then enable ADC module */ SYSCLK->CLKSEL1.ADC_S = 2; //Select 22Mhz for ADC SYSCLK->CLKDIV.ADC_N = 1; //ADC clock source = 22Mhz/2 =11Mhz; SYSCLK->APBCLK.ADC_EN = 1; //Enable clock source ADC->ADCR.ADEN = 1; //Enable ADC module /* Step 3. Select Operation mode */ ADC->ADCR.DIFFEN = 0; //single end input ADC->ADCR.ADMD = 0; //single mode
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
/* Step 4. Select ADC channel */ ADC->ADCHER.CHEN = 0x80; /* Step 5. Enable ADC interrupt */ ADC->ADSR.ADF =1; //clear the A/D interrupt flags for safe ADC->ADCR.ADIE = 1; // NVIC_EnableIRQ(ADC_IRQn); /* Step 6. Enable WDT module */ ADC->ADCR.ADST=1; }
Untuk mendapatkan nilai ADC pada port t ertentu, bias digunakan instruksi ADDR[namaport].RSLT
Misal untuk mendapatkan nilai ADC pada Port GPA7, digunakan instruksi: ADC->ADDR[7].RSLT
Latihan: Tulis program utama berikut pada program utama yang telah anda buat: int main (void ) { //Enable 12Mhz and set HCLK->12Mhz char adc_value1[15]="ADC Value:"; char adc_value2[15]="ADC Volt :"; UNLOCKREG(); SYSCLK->PWRCON.XTL12M_EN = 1; SYSCLK->CLKSEL0.HCLK_S = 0; LOCKREG(); InitADC();
Initial_pannel (); clr_all_pannal ();
//call initial pannel function
/* Synch field transmission & Request Identifier Field transmission*/
double volt; while(1) { while(ADC->ADSR.ADF==0); ADC->ADSR.ADF=1; (0,11,' '); Show_Word Show_Word (0,12,' '); (0,13,' '); Show_Word volt = ((ADC->ADDR[7].RSLT)/4095); // 12bit ADC resolution, Vref=5volt sprintf(adc_value1+10, "%d",ADC->ADDR[7].RSLT); sprintf(adc_value2+10, "%3.2f",volt); (0, adc_value1); print_lcd print_lcd (1, adc_value2); Delay(20000); ADC->ADCR.ADST=1; } }
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
MODUL 6: I2C Tujuan -
Praktikan memahami penggunaan I2C pada NuMicro 1XX Series Development Board dengan menggunakan CoCoox IDE
Pendahuluan I2C ( Inter-Integrated Circuit ) bus merupakan antarmuka 2 wire serial yang dikembangkan oleh Philips. Dikembangkan untuk aplikasi 8 bit dan banyak digunakan pada consumer electronics, automotive dan indistri. I2C bus ini berfungsi sebagai antarmuka jaringan multimaster, multi-slave dengan deteksi tabrakan data. Jaringan dapat dipasangkan hingga 128 titik dalam jarak 10 meter. Setiap titik dalam jaringan dapat mengirim dan menerima data. Setiap titik dalam jaringan harus memiliki alamat yang unik. Seiring berkembangnya waktu, I2C menjadi sebuah standar komunikasi yang banyak digunakan dalam aplikasi embedded system. Pada NuMicro 1XX series ini memiliki fitur I2C sebagai berikut:
Up to two I2C controllers.
Compatible with Philips I2C standard.
Support Master/Slave mode
Support 7 bit addressing mode
Built-in a 14-bit time-out counter to avoid the
I2C bus hang-up.5
Features (2/2)
Multiple address recognition
Pada praktikum kali ini akan dicoba menuliskan flash memori pada 24LC64 EEPROM dengan menggunakan I2C pada NuMicro. 24AA64/24LC64 (24XX64 *) adalah 64 Kbit Electrically Erasable PROM. Perangkat ini disusun sebagai delapan blok dari 1K x 8-bit memori dengan antarmuka 2-wire serial. Berikut diagram blok dari 24LC64 EEPROM:
Gambar 3. Diagram blok 24LC64 EEPROM
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Untuk menggunakan fungsi I2C pada EEPROM 24LC64 yang tersedia pada NuMicro development Board, dapat digunakan library EEPROM_24LC64.h dan Driver\DrvI2C.h. Tuliskan listing program berikut: #include #include "NUC1xx.h" #include "Driver\DrvSYS.h" void delay_loop(void) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } void delay(void) { int j; for(j=0; j<1000; j++); } uint8_t scan_key(void) { uint8_t act[4]={0x3b, 0x3d, 0x3e}; uint8_t i,temp,pin; for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin); else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,3)==0) return (i+1); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,4)==0) return (i+4); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA,pin); else DrvGPIO_ClrBit(E_GPA,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit(E_GPA,5)==0) return (i+7); } return 0; } int main(void) { uint32_t i2cdata=0,i; unsigned char temp; char addr[16]="Address:"; char Write[16]="Write:"; char read[16]="Read:"; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); /* Waiting for 12M Xtal stalble */ SysTimerDelay(5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); /*lock the protected registers */ LOCKREG(); DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */ Initial_pannel();
//call initial pannel function
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
clr_all_pannal(); print_lcd(0, "I2C with 24LC64"); print_lcd(1, "test read and "); print_lcd(2, "write function "); print_lcd(3, "press keypad"); //initial key board for(i=0;i<6;i++) DrvGPIO_Open(E_GPA, i, E_IO_QUASI); while(1) { temp=scan_key(); if(temp==1) { print_lcd(0,"Key1 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," "); DrvGPIO_InitFunction(E_FUNC_I2C1); Write_24LC64(0x00000000+temp,temp+11); i2cdata= Read_24LC64(0x00000000+temp); sprintf(addr+8,"%x",temp); sprintf(Write+6,"%x",temp+11); sprintf(read+5,"%x",i2cdata); print_lcd(1,addr); print_lcd(2,Write); print_lcd(3,read); } if(temp==2) { print_lcd(0,"Key2 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," "); DrvGPIO_InitFunction(E_FUNC_I2C1); Write_24LC64(0x00000000+temp,temp+22); i2cdata= Read_24LC64(0x00000000+temp); sprintf(addr+8,"%x",temp); sprintf(Write+6,"%x",temp+22); sprintf(read+5,"%x",i2cdata); print_lcd(1,addr); print_lcd(2,Write); print_lcd(3,read); } if(temp==3) { print_lcd(0,"Key3 had pressed "); print_lcd(1," "); print_lcd(2," "); print_lcd(3," "); DrvGPIO_InitFunction(E_FUNC_I2C1);
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Write_24LC64(0x00000000+temp,temp+33); i2cdata= Read_24LC64(0x00000000+temp); sprintf(addr+8,"%x",temp); sprintf(Write+6,"%x",temp+33); sprintf(read+5,"%x",i2cdata); print_lcd(1,addr); print_lcd(2,Write); print_lcd(3,read); } } }
Program diatas digunakan untuk menulis data melalui I2C ke EEPROM 24LC64 kemudian membaca data yang ditulis tersebut.
Latihan-1: Buat program Lanjutkan listing program diatas untuk tombol keypad matrix 4-9
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
MODUL 7: Timer (pewaktu mikrokontroler) Tujuan -
Praktikan memahami penggunaan Timer pada NuMicro 1XX Series Development Board dengan menggunakan CoCoox IDE
Pada NuMicro 1XX series tersedia Timer, dengan fitur sebagai berikut:
Four sets of 24-bit up-counting timer
Five selections of clock source and a
prescale for every timer
Time out period = (Period of timer clock input)
(8-bit Prescale + 1) * (24-bit TCMP)
Four operation modes: one shot, periodic, toggle mode and auto-reload, counting mode
Berikut diagram alur dari Timer operation:
Berikut NuMicro Family Timer Block Diagram:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Gambar. NuMicro Family Timer Block Diagram Cara menghitung periode timer dari Timer 0 ialah:
Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP) TMAX = (1 / 12 MHz) * (28) * (224-1) ≒341.3 sec. TMIN = (1 / 12 MHz) * (1+1) * (2) ≒0.318usec. 8-bit Prescale: 1~255, Setting 0 will disable prescale clock 24bit TCMP: 2~(224-1) Timer clock input: 12Mhz Berikut ini contoh fungsi yang digunakan untuk menginisialisasi Timer 0 Periodic Mode Interupt void Timer_initial(void ) { /* Step 1. Enable and Select Timer clock source */ SYSCLK->CLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source /* Step 2. Select Operation mode */ TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode /* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/ TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255] TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215] //(1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz /* Step 4. Enable interrupt */ TIMER0->TCSR.IE = 1; TIMER0->TISR.TIF = 1; //Write 1 to clear for safty NVIC_EnableIRQ( TMR0_IRQn ); //Enable Timer0 Interrupt /* Step 5. Enable Timer module */ TIMER0->TCSR.CRST = 1; //Reset up counter TIMER0->TCSR.CEN = 1; //Enable Timer0 TIMER0->TCSR.TDR_EN=1; }
// Enable TDR function
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Saat terjadi overflow, maka mikrokontroler akan mengeksekusi program yang terdapat pada fungsi void TMR0_IRQHandler(void ) // Timer0 interrupt subroutine { -masukkan program interupsi-
} Berikut contoh program saat terjadi interupsi: /*--------------------------------------------------------------------------Interrupt subroutine ---------------------------------------------------------------------------*/ static unsigned char count=0; static unsigned char loop=12; void TMR0_IRQHandler(void ) // Timer0 interrupt subroutine { unsigned char i=0; TIMER0->TISR.TIF =1; count++; if(count==5) { DrvGPIO_ClrBit( E_GPC ,loop); loop++; count=0; if(loop==17) { for(i=12;i<16;i++) { DrvGPIO_SetBit(E_GPC ,i); } loop=12; } } }
Tugas: Lengkapi listing program Timer 0 Interupt berikut ini void delay_loop(void ) { uint32_t i,j; for(i=0;i<3;i++) { for(j=0;j<60000;j++); } } /*------------------------------------------------------------------------Interrupt subroutine -----------------------------------------------------------------------*/ static unsigned char loop=12; ) // Timer0 interrupt subroutine void TMR0_IRQHandler(void {
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
unsigned char i=0; TIMER0->TISR.TIF =1; count++; if(count==5) { DrvGPIO_ClrBit( E_GPC ,loop); loop++; count=0; if(loop==17) { for(i=12;i<16;i++) { DrvGPIO_SetBit(E_GPC ,i); } loop=12; } } }
void Timer_initial(void ) { /* Step 1. Enable and Select Timer clock source */ SYSCLK->CLKSEL1.TMR0_S = 0; //Select 12Mhz for Timer0 clock source SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source /* Step 2. Select Operation mode */ TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode /* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/ TIMER0->TCSR.PRESCALE=0; // Set Prescale [0~255] TIMER0->TCMPR = 1000000; // Set TICR(TCMP) [0~16777215] // (1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz /* Step 4. Enable interrupt */ TIMER0->TCSR.IE = 1; TIMER0->TISR.TIF = 1; //Write 1 to clear for safty NVIC_EnableIRQ( TMR0_IRQn ); //Enable Timer0 Interrupt /* Step 5. Enable Timer module */ TIMER0->TCSR.CRST = 1; //Reset up counter TIMER0->TCSR.CEN = 1; //Enable Timer0 TIMER0->TCSR.TDR_EN=1;
// Enable TDR function
} ) int main(void { int i=0,j=0; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl( E_SYS_XTL12M , 1); /* Waiting for 12M Xtal stalble */ SysTimerDelay (5000); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); /*lock the protected registers */ LOCKREG();
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
DrvSYS_SetClockDivider( E_SYS_HCLK_DIV , 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
for(i=12;i<16;i++) { DrvGPIO_Open( E_GPC , i, E_IO_OUTPUT ); } Initial_pannel (); clr_all_pannal ();
//call initial pannel function
print_lcd (0, "Welcome to ELINS"); (1, "This is LB test "); print_lcd print_lcd (2, "7segmen + LCD.. "); print_lcd (3, "and Timer Int. "); Timer_initial(); while(1) { for(i=0;i<9;i++) { for(j=0;j<4;j++) { show_seven_segment (j,i); delay_loop(); } } } }
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Modul 8: PWM – Pulse Width Modulation Tujuan -
Praktikan memahami penggunaan Pulse Width Modulation pada NuMicro 1XX Series Development Board dengan menggunakan CoCoox IDE
Pada NuMicro 1xx series, terdapat PORT yang memiliki fungsi khusus sebagai port penghasil Pulse Width Modulation atau biasa disebut PWM. Berikut fitur-fitur yang terdapat didalamnya:
Four PWM Generators, each generator supports
One 8-bit prescaler
One clock divider
Two PWM-timers for two outputs, each timer includes
A 16-bit PWM down-counter
A 16-bit PWM reload value register (CNR)
A 16-bit PWM compare register (CMR)
One dead-zone generator
Two PWM outputs.
8 PWM channels or 4 PWM paired channels.
16 bits resolution.
PWM Interrupt synchronized with PWM period.
Single-shot or Continuous mode PWM.5
Berikut konfigurasi PWM/Capture Clock Source
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Konfigurasi PWM Generator:
Untuk memanggil fungsi PWM pada NuMicro 1xx series ini, pengguna diwajibkan menginisialisasi fungsi PWM terlebih dahulu. Contoh inisialisasi fungsi PWM dapat dilihat pada program berikut: void InitPWM (void ) { /* Step 1. GPIO initial */ SYS->GPAMFP.PWM0_AD13=1; /* Step 2. Enable and Select PWM clock source*/ SYSCLK->APBCLK.PWM01_EN = 1;//Enable PWM clock SYSCLK->CLKSEL1.PWM01_S = 3;//Select 22.1184Mhz for PWM clock source PWMA->PPR.CP01=1; //Prescaler 0~255, Setting 0 to stop output clock PWMA->CSR.CSR0=0; // PWM clock = clock source/(Prescaler + 1)/divider /* Step 3. Select PWM Operation mode */ //PWM0 PWMA->PCR.CH0MOD=1; //0:One-shot mode, 1:Auto-load mode //CNR and CMR will be auto-cleared after setting CH0MOD form 0 to 1. PWMA->CNR0=0xFFFF; PWMA->CMR0=0xFFFF;
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
PWMA->PCR.CH0INV=0; PWMA->PCR.CH0EN=1; PWMA->POE.PWM0=1;
//Inverter->0:off, 1:on //PWM function->0:Disable, 1:Enable //Output to pin->0:Diasble, 1:Enable
}
Fungsi diatas digunakan untuk melakukan setting PORT PWM0 dengan mode operasi auto load mode. Berikut ini contoh program penggunaan PWM. while(ADC->ADSR.ADF==0); ADC->ADSR.ADF=1; PWMA->CMR0=ADC->ADDR[7].RSLT<<4; (0,11,' '); Show_Word Show_Word (0,12,' '); Show_Word (0,13,' '); sprintf(adc_value+10, "%d",ADC->ADDR[7].RSLT); print_lcd (0, adc_value); Delay(20000); ADC->ADCR.ADST=1;
Pada program diatas, akan digunakan pengontrolan lebar pulsa PWM dengan memanfaatkan nilai ADC pada address 7 yang masuk pada input variabel resistor
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
MODUL 9: SPI – Serial Peripheral Interface Tujuan -
Praktikan memahami penggunaan Serial Peripheral Interface (SPI) pada NuMicro 1XX Series Development Board dengan menggunakan CoCoox IDE
SPI (serial peripheral interface) merupakan port komunikasi serial sinkron. Pada development board NuMicro 1XX series terdapat fitur SPI sebagai berikut:
Up to four SPI controllers
Each SPI controller can drive up to two
slave devices in master mode
Support master/slave mode operation
Support 1-channel or 2-channel serial data
IN/OUT
Configurable data length
Provide burst mode operation
Berikut blok diagram kerja SPI pada NuMicro Development Board 1XX
1bit SPI+SPI Flash+PDMA Connection
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Condition: Master mode One channel data in/out SPI clock rate 1MHz Transmit data at negative edge Receive data at positive edge Disable the auto slave select Slave select is active low SPICLK2 <--> SPI-Flash0_CLK MISO20 <--> SPI-Flash0_DO MOSI20 <--> SPI-Flash0_DI SPISS20 <--> SPI-Flash0_/CS Pada NuMicro 1XX series Development board, terdapat flash memory eksternal W25Q16BV yang memiliki konfigurasi sebagai berikut:
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
Berikut contoh pemrograman flash memory eksternal W25Q16BV dengan menggunakan SPI #define TEST_NUMBER 1 /* page numbers */ //void SPI0_Callback(uint32_t u32UserData); //volatile uint32_t SPI0_INT_Flag; void SpiFlashx2_ReadMidDid (void ); ); void SpiFlashx2_ChipErase (void uint32_t SpiFlash2_ReadStatusReg1 (void ); uint32_t SpiFlash2_ReadStatusReg2 (void ); void SpiFlashx2_WaitReady (void ); (uint8_t *, uint32_t, uint32_t); void SpiFlashx2_PageProgram void SpiFlashx2_ReadData (uint8_t *, uint8_t *, uint32_t, uint32_t); ); void Initial_pannel (void void clr_all_pannal (void ); (unsigned char, char *); void print_lcd
void SysTimerDelay(uint32_t); void delay(void ) { int j; for(j=0; j<1000; j++); }
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
uint8_t scan_key(void ) { uint8_t act[4]={0x3b, 0x3d, 0x3e}; uint8_t i,temp,pin;
for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA ,pin); else DrvGPIO_ClrBit(E_GPA ,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit( E_GPA ,3)==0) return (i+1); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA ,pin); else DrvGPIO_ClrBit(E_GPA ,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit( E_GPA ,4)==0) return (i+4); } for(i=0;i<3;i++) { temp=act[i]; for(pin=0;pin<6;pin++) { if((temp&0x01)==0x01) DrvGPIO_SetBit(E_GPA ,pin); else DrvGPIO_ClrBit(E_GPA ,pin); temp=temp>>1; } delay(); if(DrvGPIO_GetBit( E_GPA ,5)==0) return (i+7); } return 0; }
int main(void ) { uint32_t u32ByteCount, u32FlashAddress, u32PageNumber;
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
uint8_t DataBuffer0[256]; uint8_t DataBuffer1[256]; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ DrvSYS_SetOscCtrl( E_SYS_XTL12M , 1); /* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */ DrvSYS_SelectHCLKSource(0); LOCKREG(); DrvSYS_SetClockDivider( E_SYS_HCLK_DIV , 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */ Initial_pannel(); clr_all_pannal(); /* GPIO init for SPI2 */ DrvGPIO_InitFunction( E_FUNC_SPI2 ); /* GPIO init for SPI2 2-bit mode */ DrvGPIO_InitFunction( E_FUNC_SPI2_2BIT_MODE ); /* Configure SPI2 as a master, Type1 waveform, 32-bit transaction */ DrvSPI_Open( eDRVSPI_PORT2, eDRVSPI_MASTER , eDRVSPI_TYPE1 , 32); /* MSB first */ DrvSPI_SetEndian( eDRVSPI_PORT2 , eDRVSPI_MSB_FIRST ); /* Disable the automatic slave select function of SS0. */ DrvSPI_DisableAutoSS( eDRVSPI_PORT2 ); /* Set the active level of slave select. */ DrvSPI_SetSlaveSelectActiveLevel( eDRVSPI_PORT2 , eDRVSPI_ACTIVE_LOW_FALLING ); /* Configure SPI2 as 2 bits transfer mode */ DrvSPI_Set2BitTransferMode( eDRVSPI_PORT2, TRUE); /* Enable the SPI2 interrupt and install the callback function. */ //DrvSPI_EnableInt(eDRVSPI_PORT2, SPI2_Callback, 0); /* SPI clock rate 1MHz */ DrvSPI_SetClockFreq( eDRVSPI_PORT2, 1000000, 0); print_lcd(0,"SPI Sample Code "); print_lcd(1," for Flash x 2 "); print_lcd(3,"Press key 1 ....");
while(1) { if (scan_key() == 1) break; } /* read MID & DID */ SpiFlashx2_ReadMidDid(); SysTimerDelay(1000000); /* Erase SPI flash */ print_lcd(2,"Erase Flash....."); print_lcd(3," "); SpiFlashx2_ChipErase(); /* Wait ready */ SpiFlashx2_WaitReady(); /* Get the status of SPI flash */
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
print_lcd(3,"Erase done !!! SysTimerDelay(1000000);
");
/* source data */ for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) { DataBuffer0[u32ByteCount] = u32ByteCount; } /* Program SPI flash */ print_lcd(2,"Program Flash..."); print_lcd(3," "); u32FlashAddress = 0; for(u32PageNumber=0; u32PageNumber
for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) { if(DataBuffer0[u32ByteCount]!=u32ByteCount) { print_lcd(3,"F0 Verify Error!"); while(1); } if((uint8_t) DataBuffer1[u32ByteCount]!=(uint8_t) ~DataBuffer0[u32ByteCount]) { print_lcd(3,"F1 Verify Error!"); while(1); } } /* clear data buffer */ for(u32ByteCount=0; u32ByteCount<256; u32ByteCount++) { DataBuffer0[u32ByteCount] = 0; DataBuffer1[u32ByteCount] = 0; }
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
} print_lcd(3,"Verify done !!! "); DrvSPI_Close( eDRVSPI_PORT2 );
return 1; } /* void SPI2_Callback(uint32_t u32UserData) { SPI2_INT_Flag = 1; } */ // ************************************** // For W25Q16BV, Manufacturer ID: 0xEF; Device ID: 0x14 // For W26X16, Manufacturer ID: 0xEF; Device ID: 0x14 (void ) void SpiFlashx2_ReadMidDid { uint32_t au32SourceData[2]; uint32_t au32DestinationData[2]; // configure transaction length as 8 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 8); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0x90, Read Manufacturer/Device ID au32SourceData[0] = 0x90; au32SourceData[1] = 0x90; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // configure transaction length as 24 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 24); // send 24-bit '0', dummy au32SourceData[0] = 0x0; au32SourceData[1] = 0x0; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // configure transaction length as 16 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 16); // receive au32SourceData[0] = 0x0; au32SourceData[1] = 0x0; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 );
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
DrvSPI_DumpRxRegister( eDRVSPI_PORT2 , &au32DestinationData[0], 2);
if ((au32DestinationData[0] & au32DestinationData[1] & 0xffff) == 0xEF14) print_lcd(3,"MID & DID=0xEF14"); else print_lcd(3,"MID & DID Error!"); } // ************************************** void SpiFlashx2_ChipErase (void ) { uint32_t au32SourceData[2]; // configure transaction length as 8 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 8); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0x06, Write enable au32SourceData[0] = 0x06; au32SourceData[1] = 0x06; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0xC7, Chip Erase au32SourceData[0] = 0xc7; au32SourceData[1] = 0xc7; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); } // ************************************** uint32_t SpiFlash2_ReadStatusReg1 (void ) { uint32_t au32SourceData[2]; uint32_t au32DestinationData[2]; // configure transaction length as 16 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 16); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 );
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
// send Command: 0x05, Read status register 1 au32SourceData[0] = 0x0500; au32SourceData[1] = 0x0500; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // dump Rx register DrvSPI_DumpRxRegister( eDRVSPI_PORT2 , &au32DestinationData[0], 2);
return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF); } // ************************************** uint32_t SpiFlash2_ReadStatusReg2 (void ) { uint32_t au32SourceData[2]; uint32_t au32DestinationData[2]; // configure transaction length as 16 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 16); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0x35, Read status register 2 au32SourceData[0] = 0x3500; au32SourceData[1] = 0x3500; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // dump Rx register DrvSPI_DumpRxRegister( eDRVSPI_PORT2 , &au32DestinationData[0], 2);
return ((au32DestinationData[0] | au32DestinationData[1]) & 0xFF); } // ************************************** void SpiFlashx2_WaitReady (void ) { uint32_t ReturnValue;
do{ ReturnValue = SpiFlash2_ReadStatusReg1(); ReturnValue = ReturnValue & 1; }while(ReturnValue!=0); // check the BUSY bit } // **************************************
Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0 , AAERG – ELINS, UGM
void SpiFlashx2_PageProgram (uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount) { uint32_t au32SourceData[2]; uint32_t Counter; // configure transaction length as 8 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 8); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0x06, Write enable au32SourceData[0] = 0x06; au32SourceData[1] = 0x06; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // /CS: de-active DrvSPI_ClrSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // /CS: active DrvSPI_SetSS( eDRVSPI_PORT2 , eDRVSPI_SS0 ); // send Command: 0x02, Page program au32SourceData[0] = 0x02; au32SourceData[1] = 0x02; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // configure transaction length as 24 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 24); // send 24-bit start address au32SourceData[0] = StartAddress; au32SourceData[1] = StartAddress; DrvSPI_BurstWrite( eDRVSPI_PORT2, &au32SourceData[0]); // wait while (DrvSPI_IsBusy(eDRVSPI_PORT2 )) {} // configure transaction length as 8 bits DrvSPI_SetBitLength( eDRVSPI_PORT2, 8);
for(Counter=0; Counter