33
Chapter 7 Chapter 7 Synchronous Serial Synchronous Serial SPI and I2C interfaces

Chapter 7 Synchronous Serial

  • Upload
    feleti

  • View
    24

  • Download
    0

Embed Size (px)

DESCRIPTION

Chapter 7 Synchronous Serial. SPI and I2C interfaces. Checklist. The following tools will be used in this lesson: MPLAB X, Integrated Development Environment (v1.8 or later, free) MPLAB XC16, C compiler (v1.11 or later, free) - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 7  Synchronous Serial

Chapter 7Chapter 7 Synchronous Serial Synchronous Serial

SPI and I2C interfaces

Page 2: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

ChecklistChecklistThe following tools will be used in this lesson: MPLAB X, Integrated Development Environment

(v1.8 or later, free) MPLAB XC16, C compiler (v1.11 or later, free)

The following pieces of documentation will be used during this lesson: PIC24FJ128GA010 Datasheet –DS39747 (latest rev.)

Make sure they are available and/or installed and ready to use on your computer.You can download them from Microchip web site at:

http://www.microchip.com/mplabxAnd

http://www.microchip.com/xc16 The following hardware tools are recommended: Explorer 16 Demonstration Board PIC24FJ128GA010 PIM 24LC00 or similar Serial EEPROM 2 x 4.5K Ohm resistors

Page 3: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Synchronous Serial InterfacesSynchronous Serial Interfaces I2C

SPI

Page 4: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

SPI BusSPI Bus

Page 5: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Asynchronous Serial InterfaceAsynchronous Serial Interface

Page 6: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Comparison of Serial InterfacesComparison of Serial Interfaces

Page 7: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

The SPI moduleThe SPI module

Page 8: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

SPIxCON registerSPIxCON register

Page 9: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Initializing SPI2 Initializing SPI2 Pin 12 of PORTD is connected to the memory chip select (CS):#define CSEE _RD12 // select line for Serial EEPROM#define TCSEE _TRISD12 // tris control for CSEE pin

Peripheral initialization: // 1. init the SPI peripheral TCSEE = 0; // make SSEE pin output CSEE = 1; // de-select the Serial EEPROM SPI2CON1 = SPI_MASTER; // select mode SPI2STAT = SPI_ENABLE; // enable the peripheral Where:#define SPI_MASTER 0x0120 // 8-bit master mode, CKE=1, CKP =0#define SPI_ENABLE 0x8000 // enable SPI port, clear status

A small function that will be used to transfer data to and from the serial EEPROM device:

// send one byte of data and receive one back at the same timeint WriteSPI2( int data){ SPI2BUF = data; // write to buffer for TX while( !SPI2STATbits.SPIRBF); // wait transfer completion return SPI2BUF; // read the received value} // WriteSPI2

Page 10: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

The 25LC256 Serial EEPROMThe 25LC256 Serial EEPROM // 25LC256 Serial EEPROM commands #define SEE_WRSR 1 // write status register #define SEE_WRITE 2 // write command #define SEE_READ 3 // read command #define SEE_WDI 4 // write disable #define SEE_STAT 5 // read status register #define SEE_WEN 6 // write enable

Page 11: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

25LC256 Status Register25LC256 Status Register

// 2. Check the Serial EEPROM status CSEE = 0; // select the Serial EEPROM writeSPI2( SEE_STAT); // send a READ STATUS COMMAND i = writeSPI2( 0); // send/receive CSEE = 1; // deselect, terminate command

// 2.1 send a Write Enable command CSEE = 0; // select the Serial EEPROM WriteSPI2( SEE_WEN); // write enable command CSEE = 1; // deselect, terminate command

Page 12: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Writing to the EEPROMWriting to the EEPROM

// send a Write command CSEE = 0; // select the Serial EEPROM WriteSPI2( SEE_WRITE); // write command WriteSPI2( addr_MSB); // address MSB first WriteSPI2( addr_LSB); // address LSB (word aligned) WriteSPI2( data); // send 8-bit of data // continue writing more data… CSEE = 1;

// wait until any work in progress is completed while ( ReadSR() & 0x1); // check the WIP flag

Page 13: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Reading from the EEPROMReading from the EEPROM

// perform a read sequence CSEE = 0; // select the Serial EEPROM WriteSPI2( SEE_READ); // read command WriteSPI2( addr_MSB); // address MSB first WriteSPI2( addr_LSB); // address LSB (word aligned) data = WriteSPI2( 0); // send dummy, read msb // continue reading a second byte, a third… CSEE = 1;

Page 14: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

I2C Interface ExamplesI2C Interface ExamplesA few examples of devices using the I2C interface :1Mbit Serial EEPROMS: 24xx102518-bit delta sigma ADCs: MCP342116-bit delta sigma ADCs: MCP342512-bit SAR ADCs:MCP322112-bit D/A: MCP4725Integrated Temperature Sensor (+/-0.5C): MCP9803I/O Expander 8/16-bit: MCP23016/MCP2308

Consider additionally:Battery gaugesAudio codecsGPS receiversLCD displays controllersCard readers

Page 15: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Application Specific Protocols Application Specific Protocols

Examples of application specific protocols based on the I2C interface are:SMBus™, the System Management Bus, used in personal computers (and servers) for low speed system management applicationsIPMI™, the Intelligent Platform Management Interface, used to monitor the system health and manage systems (mostly servers) remotely.PMBus™, the Power Management Bus, used by advanced digitally controlled power supply units to monitor, configure and control power.

Page 16: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

I2C Data Transfer RulesI2C Data Transfer Rules

Two simple rules dictate how to operate from here:When the SCL line is low, and only at this time, the SDA line can change.When the SCL line is high, the SDA line status indicates the value of a bit.Two exceptions to rule 1 create special conditions that are used to delimit the beginning and end of each transaction between two devices on the bus. When SCL is high:A START condition is indicated by the SDA line changing from high to lowA STOP condition is indicated by the SDA line changing from low to high

Page 17: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

The 24LC00 Serial EEPROMThe 24LC00 Serial EEPROMI2C has been for years the favorite choice for serial EEPROM users and manufacturers for two reasons:Only two pins (I/Os) are required to communicate with the device, enabling the embedded control designer to use very low pin count (inexpensive) microcontrollers.Just four pads (areas of contacts on the chip) are required for a Serial EEPROM device. Two provide the power supply and the remaining two are the I2C lines. This reduces the silicon area overhead due to the contacts on a typically very small device -- hence the high impact/cost of the pads.

In practice most I2C serial EEPROMs have at least a fifth contact/pin (WP) to protect the device contents by disabling writing.

Page 18: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Talking to the Serial EEPROMTalking to the Serial EEPROM

Page 19: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

The SEE GrammarThe SEE GrammarUsing the following simple notation:S = START sequenceP = STOP sequenceA/N = Acknowledge bit0xXX= data byte (hex notation)0bXXXXXXXX =data byte (in binary notation)and using brackets () to indicate parts of the conversation produced by a slave we can represent a typical I2C protocol message in a compact notation

Here is an example of a read command sequence for a 24LC00 (128 bit) SEE:S 0b01010001 (A) (Data) NP

Page 20: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

A Write ExampleA Write Example

S 0b01010000 (A) ByteAddress (A) Data (A) P

Page 21: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

I2CxCON registerI2CxCON register

Page 22: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Initializing the I2C moduleInitializing the I2C module

void InitSEE( long fcy)// fcy = processor operating frequency in Hz (system clock){ // Configure I2C for 7 bit address mode 100kHz  OpenI2C1( I2C_ON | I2C_IDLE_CON | I2C_7BIT_ADD | I2C_STR_EN | I2C_GCALL_DIS | I2C_SM_DIS | I2C_IPMI_DIS, (fcy /(2*BUS_FRQ))-1); IdleI2C1(); T1CON=0x8030; TMR1=0; while( TMR1< 100);} //InitSEE

Page 23: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Sending the AddressSending the Addressint addressSEE( long add)// send the address selection command// repeat if SEE busy{ int cmd;  // 1. Form SEE command + address msb (3) cmd= 0xA0|((add>>7)&0xE);  // 2. WRITE(!) the Address msb // try send command and repeat until ACK is received while( 1) { StartI2C1(); IdleI2C1();  // send command and address msb(3) MasterWriteI2C1( cmd+WRITE_CMD); IdleI2C1();  if (I2C1STATbits.ACKSTAT==0) break;  StopI2C1(); IdleI2C1(); } // while waiting for ACK  // 3. send byte address MasterWriteI2C1( add); IdleI2C1();  // 4. exit returning the cmd byte return cmd;} // addressSEE

Page 24: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Logic Analyzer CaptureLogic Analyzer Capture

Page 25: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Writing a 16-bit valueWriting a 16-bit value

void iWriteSEE( long add, int v)// SEE write command sequence{ int cmd;  // 1. select address cmd = AddressSEE( add);  // 2. stream data out MasterWriteI2C1( v&0xFF); IdleI2C1();  MasterWriteI2C1( v>>8); IdleI2C1();  // 3. terminate the command sequence StopI2C1(); IdleI2C1(); } // iWriteSEE

S 0b01010000 (A) ByteAddress (A) DataLSB (A) DataMSB (A) P

Page 26: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Reading a 16-bit valueReading a 16-bit value

int iReadSEE( long add)

// random access read command sequence

{

int cmd, r;

 

// 1. select address

cmd = AddressSEE( add);

 

StopI2C1();

IdleI2C1();

 

// 2. read command

StartI2C1(); IdleI2C1();

MasterWriteI2C1( cmd+READ_CMD);

IdleI2C1();

 

// 3. stream data in (will continue until NACK is sent)

r= MasterReadI2C1( );

 

AckI2C1(); IdleI2C1();

r|= (MasterReadI2C1()<<8);

 

// 4. terminate read sequence (send NACK then STOP)

NotAckI2C1(); IdleI2C1();

StopI2C1(); IdleI2C1();

 

return r;

} // iReadSEE

S 0b01010000 (A) ByteAddress(A) PS 0b01010001 (A) (DataLSB) [A] (Data MSB) NP

Address SelectionAddress Selection

Data ReadData Read

Page 27: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

I2C Serial EEPROM SummaryI2C Serial EEPROM Summary

Page 28: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Notes for the PIC MCU ExpertsNotes for the PIC MCU ExpertsIn addition to the SPI options available on most PIC microcontroller (offered by the SSP and MSSP modules), such as:Selectable clock polarity Selectable clock edge Master or Slave mode operationThe PIC24 SPI interface module adds several new capabilities, including:A 16-bit transfer modeData input sampling phase selectionFramed transmission modeFrame synch pulse control (polarity and edge selectable)Enhanced Mode (8 deep transmit and receive FIFOs)Using the new Enhanced Mode, with 8 levels deep FIFOs , up to 8 words of data (16 bytes) can be written or retrieved from the SPI buffers in short bursts, leaving more time to the CPU to process the data in between.

Page 29: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Tips and TricksTips and TricksSafety measures suggested to reduce the risk of SEE data corruption:Ensure adequate power supply decoupling (a capacitor) is provided close to the memory device.A pull up resistor (10k Ohm) is provided on the Chip Select line, to avoid floating during the microcontroller power up and reset.An additional pull down resistor (10k Ohm) can be provided on the SCK clock line to avoid clocking of the peripheral during boundary scan and other board testing procedures.Verify clean and fast power-up and down slope are provided to the microcontroller to guarantee reliable Power On Reset operation. If necessary add an external voltage supervisor (see MCP809 devices for example).

Page 30: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Tips and TricksTips and TricksA number of software methods can be employed to prevent a program bug might trigger the write routine:Avoid reading and especially updating the NVM content right after power up. Allow a few milliseconds for the power supply to stabilize (application dependent).Add a software write-enable flag, and demand that the calling application set the flag before calling the write routine, possibly after verifying some essential application specific entry condition.Add a stack level counter; each function in the stack of calls implemented by the library should increments the counter upon entry and decrement it on exit. The write routine should refuse to perform if the counter is not at the expected level.Some refuse to use the NVM memory locations corresponding to the first address (0x0000) and/or the last address (0xffff) believing they could be more likely to be the subject to corruption. Store two copies of each essential piece of data, performing two separate calls to the write routine. If each copy contains even a simple checksum, it will be easy, when reading it back, to discard the corrupted one and recover.

Page 31: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Suggested ExcercisesSuggested Excercises Several functions in the library are performing locking loops that could

reduce the overall application performance. By utilizing the SPI port interrupts implement a non blocking version of the library.

Enable the new SPI 16-bit mode to accelerate basic read and write operation.

Develop (circular) buffered versions of the read and write functions.

Page 32: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Recommended ReadingsRecommended Readings Eady, F. (2004), Networking and

Internetworking with Microcontrollers, Newnes, Burlinghton, MA

An entertaining introduction to serial communication in embedded control.

Page 33: Chapter 7  Synchronous Serial

Di Jasio – Programming 16-bit Microcontrollers in C (Second Edition)

Online ResourcesOnline Resources Total Endurance Software

http://www.microchip.com/totalendurance This tool will help you estimate the endurance to

expect from a given NVM device in your actual application conditions. It will give you an indication of the total number of e/w cycles or the number of expected years of your application life before a certain target failure-rate is reached.