
/**********************************************************/
/* Examples Program For "CP-JR ARM7 LPC2368" */
/* Target MCU : Philips ARM7-LPC2368 */
/* : X-TAL : 12.00 MHz */
/* : PLL Setup = MSEL(12),NSEL(1) */
/* : CCLK = 4, USB = 6, PLCK0,1 = cclk/4 */
/* : SYSTEMcclk = 72MHz, USB = 48MHz */
/* : PLCK = 18MHz */
/* Keil Editor : uVision4 V4.14 */
/* Compiler : Keil Realview MDK V3.20 */
/* Create By : MAN */
/* Last Update : 9/March/2011 */
/* Function : Example Use SPI Interface MCP3202 */
/* : and MCP4821 */
/**********************************************************/
#include < LPC23xx.H > // LPC2368 MCU Register
#include < stdio.h > // For Used Function printf
// Baud Rate
#define pclk 18000000UL
#define BAUD 115200
#define DLL_Config pclk/(16*BAUD)
#define Vadc 4095
// UART Buffer
char uart2_buf[]; // "sprint" UART[2] Buffer
/* pototype section */
void init_serial2 (void); // Initil UART-2
void putchar2(int ch); // Put Char To UART-2
int getchar2(void); // Get Char From UART-2
void print_uart2(void); // Print String to UART2
void delay(unsigned long int); // Delay Time Function
void delay_ms(unsigned long ms); // Delay Time @ CLK 72MHz j=5525
/////////////////// SPI Function //////////////////////
void Initial_SPI (void);
void spi_transmit(unsigned int cData);
unsigned int spi_transfer_byte(unsigned int cData);
unsigned int spi_transfer_word(unsigned int cData);
void spi_transfer_byte1(unsigned int cData);
void spi_transfer_word1(unsigned int cData);
/********************************/
/* Initial UART2 = 115200,N,8,1 */
/********************************/
void init_serial2 (void)
{
// xxxx xxxx 0101 xxxx xxxx xxxx xxxx xxxx
PINSEL0 &= 0xFF0FFFFF; // Reset P0.10,P0.11 Pin Config
PINSEL0 |= 0x00100000; // Select P0.10 = TxD(UART2)
PINSEL0 |= 0x00400000; // Select P0.11 = RxD(UART2)
// xxxx xxx1 xxxx xxxx xxxx xxxx xxxx xxxx
PCONP |= 0x01000000; // UART2 Power-ON
U2LCR = 0x83; // 8 bits, no Parity, 1 Stop bit
//U2DLM = DLL_Config >> 8;
U2DLL = 6; //DLL_Config; (Decimal) // Baud 115200BPS for 18MHz PCLK Clock
U2FDR = 0x85; // Fractional Divider
U2LCR = 0x03; // DLAB = 0
}
/******************************/
/* Write Character To UART[2] */
/******************************/
void putchar2 (int ch)
{
if (ch == '\n')
{
while (!(U2LSR & 0x20)); // Wait TXD Buffer Empty
U2THR = 0x0D; // Write CR
}
while (!(U2LSR & 0x20)); // Wait TXD Buffer Empty
U2THR = ch;
}
/******************************/
/* Get character From UART[2] */
/******************************/
int getchar2()
{
while (!(U2LSR & 0x01)); // Wait RXD Receive Data Ready
return (U2RBR); // Get Receice Data & Return
}
/***************************/
/* Print String to UART[2] */
/***************************/
void print_uart2(void)
{
char *p; // Pointer Buffer
p = uart2_buf; // UART Buffer
do // Get char & Print Until null
{
putchar2(*p); // Write char to UART
p++; // Next char
}
while(*p != '\0'); // End of ASCII (null)
return;
}
/***********************/
/* Delay Time Function */
/* 1-4294967296 */
/***********************/
void delay(unsigned long int count1)
{
while(count1 > 0) {count1--;} // Loop Decrease Counter
}
void delay_ms(unsigned long ms)
{
unsigned long i,j;
for(i=0;i < ms; i++) for(j=0;j < 5525;j++); } /////////////////// Initial_SPI //////////////////////////////////////// void Initial_SPI (void) { PCONP |= 0x00000100; // SPI Power On // SPI Control Register S0SPCR = 0x0020; // The SPI operates in Master mode // SPI Clock Counter Register S0SPCCR = 18; // PCLK / S0SPCCR = 18MHz/18 = 1MHz = 0x12 // PIN Select for SPI0 PINSEL0 &= 0x3FFFFFFF; // Clear P0.15 PINSEL0 |= 0xC0000000; // P0.15 SCK PINSEL1 &= 0xFFFFFFC3; // Clear P0.17, P0.18 PINSEL1 |= 0x0000000C; // P0.17 MISO PINSEL1 |= 0x00000030; // P0.18 MOSI } /////////////////////////spi_transmit////////////////////////////////// void spi_transmit(unsigned int cData) { S0SPDR = cData; // Wait for transmission complete while(!(S0SPSR & 0x80)); } /////////////////////////spi_transfer_byte////////////////////////////// unsigned int spi_transfer_byte(unsigned int cData) { // send the given data S0SPDR = cData; // wait for transfer to complete while(!(S0SPSR & 0x80)); // return the received data return S0SPDR; } /////////////////////////spi_transfer_word////////////////////////////// unsigned int spi_transfer_word(unsigned int cData) { unsigned int rxData = 0; // send MS byte of given data rxData = (spi_transfer_byte((cData>>8) & 0x00FF))<<8; // xxxx b11-b8 // send LS byte of given data rxData |= (spi_transfer_byte(cData & 0x00FF)); // b7-b0 // return the received data return rxData; } /////////////////////////spi_transfer_byte1////////////////////////////// void spi_transfer_byte1(unsigned int cData) { // send the given data S0SPDR = cData; // wait for transfer to complete while(!(S0SPSR & 0x80)); } /////////////////////////spi_transfer_word1////////////////////////////// void spi_transfer_word1(unsigned int cData) { // send MS byte of given data spi_transfer_byte1((cData>>8) & 0x00FF); // xxxx b11-b8
// send LS byte of given data
spi_transfer_byte1(cData & 0x00FF); // b7-b0
}
//////////////////////// MAIN FUNCTION ////////////////////////////////
int main(void)
{
unsigned int rxData = 0;
unsigned int txData4821 = 0;
// Initial UART2
init_serial2(); // Initilial UART2 = 115200,N,8,1
// Initial SPI
Initial_SPI();
// USE Fast GPIO Port 0,1
SCS &= 0xFFFFFFFE;
SCS |= 0x00000001;
// PIN Select for SPI
PINSEL1 &= 0xFC0FFFFF; // P0.26 P0.27 and P0.28 is GPIO for // ChipSelect and Latch MCP4821
FIO0DIR |= 0x1C000000; // P0.27 P0.28 and P0.26 is Output
FIO0SET |= 0x08000000; // P0.27 is Hight CS
FIO0SET |= 0x10000000; // P0.28 is Hight Latch
FIO0SET |= 0x04000000; // P0.26 Hight for ChipSelect MCP3202
// Loop //
while(1)
{
FIO0CLR = 0x04000000; // Active SPI
// Transmit 1 Start bit MCP3202 = 0x01, MCP3204 = 0x06
spi_transmit(0x01);
// Transmit 2 0xX000 (See Table 5-1 MCP3202 Datasheet)
// Configbit and channal MCP3202 = 0xA000, MCP3204 = 0x0000
rxData = (spi_transfer_word(0xA000)) & 0x0FFF;
FIO0SET = 0x04000000; // Inactive SPI
//sprintf(uart2_buf,"0x%X\n",rxData);
sprintf(uart2_buf,"\nAnalog to Digital 0x0%X \nVoltage = %d.%d Volt\n", rxData, (rxData*33/10)/Vadc, (rxData*33/10)%Vadc);
print_uart2();
FIO0CLR = 0x08000000; // Active MCP4821
// 0xX000 ( X = bit12 - bit15 ) See Datasheet MCP4821 P.17
txData4821 = 0x1000 | rxData;
spi_transfer_word1(txData4821); // Transmit
FIO0SET = 0x08000000; // Inactive MCP4821
FIO0CLR = 0x10000000; // Active Latch
FIO0SET = 0x10000000; // Inactive Latch
delay_ms(1000);
}
}
ตัวอย่างการใช้งาน spi ในโหมด master
ReplyDeleteส่วนสำคัญอยู่ตรงนี้ครับ ดูคล้ายๆไลบรารี่
////////// SPI Function //////// void Initial_SPI (void);
void spi_transmit(unsigned int cData);
unsigned int spi_transfer_byte(unsigned int cData);
unsigned int spi_transfer_word(unsigned int cData);
แล้วก็การเรียกใช้งานใน main ครับ
step 1: ส่งลอจิก low ไป trig ให้อุปกรณ์ slave เริ่มติดต่อกับเรา
step 2: ส่ง command หรือส่งข้อมูล ขึ้นอยู่กับอุปกรณ์ที่เราจะติดต่อด้วย ดูได้ในดาต้าชีท
step 3: ส่งลอจิก high ไปยกเลิกการติดต่อกับอุปกรณ์
spi มี 4 ขา SS,SCK,MISO,MOSI ขา SS ให้ประกาศเป็น GPIO ได้ หรือใช้ขาอื่นแทนก็ได้
ส่วนความเร็วของ clk ที่ขา sck ให้ดูในดาต้าชีทของแต่ละอุปกรณ์ว่าใช้ความเร็วได้สูงสุดเท่าไหร่ ก็ตั้งความเร็วให้ใกล้กับมัน
Pray For JAPAN
กด like.
ReplyDeleteขอบคุณครับ จะเอาไปศึกษาอีกทีนะครับคุณ yui อิอิ
ReplyDelete