Книга: Advanced PIC Microcontroller Projects in C
PROJECT 7.1 — Read CID Register and Display on a PC Screen
PROJECT 7.1 — Read CID Register and Display on a PC Screen
In this project a SD card is interfaced to a PIC18F452-type microcontroller. The serial output port of the microcontroller is connected to the serial input port (e.g., COM1) of a PC. The microcontroller reads the contents of the card CID register and sends this data to the PC so it can be displayed on the PC screen.
Figure 7.7 shows the block diagram of the project.
Figure 7.7: Block diagram of the project
The circuit diagram of the project is shown in Figure 7.8. The SD card is inserted into a card holder and then connected to PORTC of a PIC18F452 microcontroller through 2.2K and 3.3K resistors, using the following pins:
• Card CS to PORTC pin RC2
• Card CLK to PORTC pin RC3
• Card DO to PORTC pin RC4
• Card DI to PORTC pin RC5
Figure 7.8: Circuit diagram of the project
According to the SD card specifications, when the card is operating with a supply voltage of VDD = 3.3V, the input-output pin voltage levels are as follows:
• Minimum produced output HIGH voltage, VOH = 2.475V
• Maximum produced output LOW voltage, VOL = 0.4125V
• Minimum required input HIGH voltage, VIH = 2.0625
• Maximum input HIGH voltage, VIH = 3.6V
• Maximum required input LOW voltage, VIL = 0.825V
Although the output produced by the card (2.475V) is sufficient to drive the input port of a PIC microcontroller, the logic HIGH output of the microcontroller (about 4.3V) is too high for the SD card inputs (maximum 3.6V). Therefore, a potential divider is set up at the three inputs of the SD card using 2.2K and 3.3K resistors. This limits the maximum voltage at the inputs of the SD card to about 2.5V:
SD card input voltage = 4.3V ? 3.3K/(2.2K + 3.3K) = 2.48V
Serial output port pin RC6 (TX) of the microcontroller is connected to a MAX232-type RS232 voltage level converter chip and then to a 9-way D-type connector so it can be connected to the serial input port of a PC.
The microcontroller is powered from a 5V supply which is obtained via a 7805-type 5V regulator with a 9V input. The 2.7V–3.6V supply required by the SD card is obtained via an MC33269DT-3.3 regulator with 3.3V output and is driven from the 5V input voltage.
The program listing of the project is given in Figure 7.9 (program SD1.C). At the beginning of the main program, character array CID is declared to have 16 bytes.
/**************************************************************
SD CARD PROJECT
===============
In this project a SD card is connected to PORTC as follows:
CS RC2
CLK RC3
DO RC4
DI RC5
In addition, a MAX232 type RS232 voltage level converter chip is
connected to serial output port RC6.
The program reads the SD card CID register parameters and
sends it to a PC via the serial interface. This process is
repeated at every 10 seconds.
The UART is set to operate at 2400 Baud, 8 bits, no parity.
Author: Dogan Ibrahim
Date: August 2007
File: SD1.C
**************************************************************/
//
// This function sends carriage-return and line-feed to USART
//
void Newline() {
Soft_Uart_Write(0x0D); // Send carriage-return
Soft_Uart_Write(0x0A); // Send line-feed
}
//
// This function sends a space character to USART
//
void Space() {
Soft_Uart_Write(0x20);
}
//
// This function sends a text to serial port
//
void Text_To_Usart(unsigned char *m) {
unsigned char i;
i = 0;
while(m[i] != 0) { // Send TEXT to serial port
Soft_Uart_Write(m[i]);
i++;
}
}
//
// This function sends string to serial port. The string length is passed as
// an argument
//
void Str_To_Usart(unsigned char *m, unsigned char l) {
unsigned char i;
unsigned char txt[4];
i=0;
for(i=0; i<l; i++) {
ByteToStr(m[i],txt);
Text_To_Usart(txt);
Space();
}
}
//
// Start of MAIN program
//
void main() {
unsigned char error,CID[16];
unsigned char msg[] = " SD CARD CID REGISTER";
//
// Configure the serial port
//
Soft_Uart_Init(PORTC,7,6,2400,0); // TX=RC6
//
// Initialize the SD card
//
Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW, LOW_2_HIGH);
//
// Initialize the SD bus
//
while(Mmc_Init(&PORTC,2));
//
// Start of MAIN loop. Read the SD card CID register and send the data
// to serial port every 10 seconds
//
for(;;) // Endless loop
{
Text_To_Usart(msg); // Send TEXT
Newline(); // Send newline
Newline(); // Send newline
error = Mmc_Read_Cid(CID); // Read CID register into CID
//
// Send the data to RS232 port
//
Str_To_Usart(CID,16); // Send CID contents to UART
Delay_Ms(10000); // Wait 10 seconds
Newline();
Newline();
}
}
Figure 7.9: Program listing
Variable msg is loaded with the message that is to be displayed when power is applied to the system. Then the UART is initialized at PORTC with a baud rate of 2400.
Before the SD card library functions are used, the function Spi_Init_Advanced must be called with the given arguments. Then the SD card bus is initialized by calling function Mmc_Init, where it is specified that the card is connected to PORTC. The program then enters an endless loop that repeats every ten seconds. Inside this loop the heading message is displayed followed by two new-line characters. The program then reads the contents of register CID by calling function Mmc_Read_Cid and stores the data in character array CID. The data is then sent to the serial port by calling function Str_To_Usart. At the end of the loop two new-line characters are displayed, the program waits for ten seconds, and the loop is repeated.
The operation of the project can be tested by connecting the device to a PC and starting the HyperTerminal terminal emulation program on the PC. Set the communications parameters to 2400 baud, 8 data bits, 1 stop bit, and no parity bit. An example output on the screen is shown in Figure 7.10.
Figure 7.10: An example output from the project on HyperTerminal
The data returned by the card is:
28 83 86 83 68 77 32 32 16 147 0 89 90 0 115 183
Referring to Table 7.3, we can say the following about this card:
Manufacturer ID = 28 decimal
OEM/Application ID = SV
Product Name = SDM
Product Revision = 1.0 (decimal 16 corresponds to binary “0001 0000” which is 10 in BCD; the revision number is as n.m, giving 1.0)
Serial Number = 16 147 0 89 decimal
Reserved = “0000” bits (4 bits only)
Manufacture Date Code = 073 (this 12-bit parameter has the binary value “0000 0111 0011” where the upper 4 bits are derived from the lower 4 bits of the reserved field and the lower 8 bits are decimal 115. This gives BCD value 073. The date is in YYM format since 2000. Thus, this card was manufactured in 2007, March).
CRC = “1011100” binary (the LSB bit is always 1)
- Класс StreamReader
- Разработка приложений баз данных InterBase на Borland Delphi
- Open Source Insight and Discussion
- Introduction to Microprocessors and Microcontrollers
- How to read
- Chapter 6. Traversing of tables and chains
- Chapter 8. Saving and restoring large rule-sets
- Chapter 11. Iptables targets and jumps
- Chapter 5 Installing and Configuring VirtualCenter 2.0
- Chapter 16. Commercial products based on Linux, iptables and netfilter
- Appendix A. Detailed explanations of special commands
- Appendix B. Common problems and questions