Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Logis6cs(
ELEC327:(Lecture(6(
Serial(Communica6on(
& No#lectures#next#week!#
& Next#labs:#
– Low(power((due(1/31)(
– Serial(communica6ons((due(2/7)(
– Midterm(projects((demo(2/19)(
Today(
& Power(measuring(
& Serial(communica6ons(
Prac6cal(Power(Measuring(
Lab(4(
& Workshop(Lab(6(K(Convert(ADC(sampling(code(
to(“low(power”(
& Measure(power(using(DMM(
& Write(a(0.5(Hz(LED(blink(func6on(for(lowest(
and(highest(power.(Document(your(
measurement(technique.(
Communica6ons(
& The(simplest(is(parallel(
– One(way(
& There(may(be(mechanism(for(
peripheral(to(get(aYen6on(of((
μC((i.e.,(interrupt,(or(poll)(
(
(
Mul:ple#(8#
typically)#data#
lines#
μC#
“Latch”(
Peripheral#
“CS”(
– Two(way(
& We(need(another(line(to((
differen6ate(between(read((
and(write.(
& Half(duplex((one(way(at(a(6me)(
& Full(duplex((both(ways(at(once;((
needs(two(sets(of(data(lines.(
(
(
(
Data#
lines#
μC#
“Latch”(
Peripheral#
“CS”(
“R/~W”(
& This(is(resource(expensive((pins,(realKestate…)(in(terms(of(
hardware,(but(easy(to(implement,(and(fast.(
Serial(Communica6ons(
& Many(fewer(lines(are(required(to(transmit(data.((This(is(requires(
fewer(pins,(but(adds(complexity.(
(
(
Data(
(
(
Clock(
μC#
Peripheral#
(
“CS”(
(
(
(
(
& Synchronous(communica6ons(requires(clock.((Whoever(controls(
the(clock(controls(communica6on(speed.(
& Asynchronous(has(no(clock,(but(speed(must(be(agreed(upon(
beforehand((baud(rate).(
MSP430G2553(
Universal(Serial(Communica6on(
Interface(
& SPI(
A
& I2C(
Vdd(
SPI(
Slave(
R(
R(
SDA(
& InterKIntegrated(Circuit(Interface(SCL(
& Single(Master/Mul6ple(Slaves(
B
SCLK(
MOSI(
MISO(
SSN(
SPI(
Master(
& Serial(Peripheral(Interface(
& Single(Master/Single(Slave(
USCI(
! USCI_A0
!
supports:
! SPI (3 or 4 wire)
! UART
! IrDA
USCI_B0 supports:
! SPI (3 or 4 wire)
! I2C
USCI(Serial(Protocols(
µC(
Master(
& UART(
& Universal(Asynchronous(Receiver/
TransmiYer(
& Full(duplex(
R/T(
DAC(
Slave(
Tx(
Rx(
ADC(
Slave(
µC(
Slave(
Rx(
Tx( R/T(
Protocols …
51
Asynchronous(Serial((RSK232)(
& Commonly(used(for(oneKtoKone(communica6on.((
& There(are(many(variants,(the(simplest(uses(just(two(lines,(TX(
(transmit)(and(RX((receive).(
& Transmission(process((9600(baud,(1(bit=1/9600=0.104(mS)(
–
–
–
–
–
Transmit(idles(high((when(no(communica6on).(
It(goes(low(for(1(bit((0.104(mS)(
It(sends(out(data,(LSB(first((7(or(8(bits)(
There(may(be(a(parity(bit((even(or(odd(–(error(detec6on)(
There(may(be(a(stop(bit((or(two)(required(
RS232(Voltage(levels(
& From(processor(side,(0V=logic(0,(((((((((((3.3V=logic(1(
& In(a(“serial”(cable(+12→+3V=logic(0,((((K3→K12V=logic(1(
(
(
(
(
(
RS232(–(Handshaking(
& Some(RS232(connec6ons(using(handshaking(lines(between(
DCE((Data(Communica6ons(Equipment)(and(DTE((Data(
Terminal(Equipment).(((
– RTS((Ready(To(Send)(
& Sent(by(the(DTE(to(signal(the(DCE(it(is(Ready(To(Send.(
– CTS((Clear(To(Send)(
& Sent(by(the(DCE(to(signal(the(DTE(that(it(is(Ready(to(Receive.(
– DTR((Data(Terminal(Ready)(
& Sent(to(DTE(to(signal(the(DCE(that(it(is(ready(to(connect(
– DSR((Data(Set(Read)(
& Sent(to(DC(to(signal(the(DTE(that(it(is(ready(to(connect(
& In(prac6ce(if(these(handshaking(lines(are(used(it(can(be(
difficult(to(set(up(the(serial(communica6ons,(but(it(is(quite(
robust(once(working.(
& There(is(also(soqware(handshaking((XON/XOFF)(
& DTE(and(DCE(have(different(connector(pinouts.(
UART(code(
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ;
P1SEL2 = BIT1 + BIT2;
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 = 8;
UCA0BR1 = 0;
UCA0MCTL = UCBRS2 + UCBRS0;
UCA0CTL1 &= ~UCSWRST;
IE2 |= UCA0RXIE;
}
//
//
//
//
//
//
//
//
//
//
//
//
MSP430#USCI#in#UART#mode#
(also(USART(peripheral)(
UART#mode#features#include:#
& (7K(or(8Kbit(data;((odd,(even,(or(nonKparity(
& (Independent(transmit(and(receive((
& (LSBKfirst(or(MSBKfirst(data((
& (Receiver(startKedge(detec6on(for(autoK
wake(up(from(LPMx(modes(
& (Independent(interrupt(capability(for(
receive(and(transmit(
& (Status(flags(for(error(detec6on(and(
suppression(
& (BuiltKin(idleKline(and(addressKbit(
communica6on(protocols(for(
mul6processor(systems(
& (Status(flags(for(address(detec6on(
Echo received character, RX ISR used. Normal mode is LPM0.
USCI_A0 RX interrupt triggers TX Echo.
Baud rate divider with 1MHz = 1MHz/115200 = ~8.7
ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
__bis_SR_register(LPM0_bits + GIE);
SPI((a(synchronous(interface)(
(Serial(Peripheral(Interface(K(Motorola)(
MSP430G2xx3
----------------/|\|
XIN|| |
|
--|RST
XOUT||
P1.2/UCA0TXD|------------>
|
P1.1/UCA0RXD|<------------
// Clock = 1MHz
// P1.1 = RXD, P1.2=TXD
//
//
//
//
//
//
SMCLK
1MHz 115200 (Formulae in data sheet)
1MHz 115200
Modulation UCBRSx = 5
**Initialize USCI state machine**
Enable USCI_A0 RX interrupt
// Enter LPM0, interrupts enabled
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG));
// USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF;
// TX -> RXed character
}
& Two(types(of(devices,(masters(and(slaves.(((
& We’ll(consider(only(one(master,(but(
mul6ple(slaves.(
& Signals(
–
–
–
–
SCLK:(Serial(CLocK,(set(by(Master(
MOSI:(Master(Out,(Slave(In(
MISO:(Master(In,(Slave(Out(
~SS:(Slave(Select(
& Each(slave(gets(its(own(slave(select((other(lines(
are(shared)(
& Pulling(line(low(selects(slave(
SPI(and(the(clock(
SPI(Capabili6es(
(intro)(
& Clock(idles(low(
& Master(pull(slave(select(line(low(to(select(device.(
& First(bit(of(data(gets(put(on(MISO(and(MOSI((
(so(a(byte(goes(both(ways)(
& Data(gets(shiqed(out((typically(8(bits,(but(not(necessarily)(
? Always full-duplex
– Communicates in both directions simultaneously
– Transmitted (or received) data may not be meaningful
? Multiple Mbps transmission speeds
– 0-50 MHz clock speeds not uncommon
? Transfer data in 4 to 16 bit characters
? Supports multiple slaves
– The(data(gets(put(on(bus(on(falling(edge(of(clock((or(SS).(
– The(data(gets(read(on(the(rising(edge(of(clock.(
17
SPI(and(the(clock(
(the(hard(truth)(
Unfortunately,(clock(can(be(set(many(ways(as(determined(by(clock(polarity(and(phase.(
& CPOL=0:(Base(value(of(the(clock(is(0(
– CPHA=0:(Data(read(on(rising(edge,(put(on(bus(on(falling(edge(of(SCLK.((i.e.,(clock(is(low).(
(Case(from(previous(slide)(
– CPHA=1:(Data(read(on(falling(edge,(put(on(bus(on(rising(edge((i.e.,(clock(is(high).(
& CPOL=1:(Base(value(of(the(clock(is(1(
– CPHA=0:(Data(read(on(falling(edge,(put(on(bus(on(rising(edge((i.e.,(clock(is(high).(
– CPHA=1:(Data(read(on(rising(edge,(put(on(bus(on(falling(edge((i.e.,(clock(is(low).(
SPI(tradeoffs:(the(pros(and(cons(
? Pros
–
–
–
–
Fast for point-to-point connections
Easily allows streaming/constant data inflow
No addressing in protocol, so it’s simple to implement
Broadly supported
? Cons
–
–
–
–
Slave select/chip select makes multiple slaves more complex
No acknowledgement (can’t tell if clocking in garbage)
No inherent arbitration
No flow control (must know slave speed)
20
SPI#and#SCI#
SPI(is(used(everywhere!(
& Peripherals(
– LCDs(
– Sensors(
– Radios(
– Lots(of(other(chips(
& Microcontrollers(
– Almost(all(MCUs(have(SPI(masters(
– Some(have(SPI(slaves(
21
SPI(Code(
// MCLK = SMCLK = default DCO ~1048k, BRCLK = SMCLK/2
//
/|\ ---------------------//
TLC549
| |
XIN |32kHz
//
--------------|RST
XOUT|//
|
CS|<---|P3.0
|
//
|
DATAOUT|--->|P3.2/UCB0SOMI
|
// ~>| IN+ I/O CLK|<---|P3.3/UCB0CLK
P5.1|--> LED
void main(void)
{
volatile unsigned int i;
char data;
P5DIR |= 0x02;
P3SEL |= 0x0C;
P3DIR |= 0x01;
UCB0CTL0 |= UCMST+UCSYNC+UCMSB;
UCB0CTL1 |= UCSSEL_2;
UCB0BR0 = 0x02;
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST;
while(1)
{
P3OUT &= ~0x01;
UCB0TXBUF = 0x00;
while (!(IFG2 & UCB0RXIFG));
}
//
//
//
//
//
//
P5.1 output
P3.3,2 option select
P3.0 output direction
8-bit SPI mstr, MSb 1st, CPOL=0, CPHS=0
SMCLK
Set Frequency
// **Initialize USCI state machine**
// Enable TLC549 (A/D) , ~CS (~SS) reset
// Dummy write to start SPI
// USCI_B0 RX buffer ready?
// data = 00|DATA
P3OUT |= 0x01;
// Disable TLC549, ~CS (~SS) set
if(data>=0x7F) P5OUT |= 0x02;
else P5OUT &= ~0x02;
// data = AIN > 0.5(REF+ - REF-)?
// LED off
}
data = UCB0RXBUF;
LED On
SPI#mode#features#include:#
& 7K(or(8Kbit(data(length(
& LSBKfirst(or(MSBKfirst(data(
& Master(or(slave(modes(
& Selectable(clock(polarity(
and(phase(control(
& Programmable(clock(
frequency(in(master(mode(
& Independent(transmit(and(
receive(
& Con6nuous(transmit(and(
receive(
& Independent(interrupt(
capability(for(receive(and(
transmit(
& (Slave(opera6on(in(LPM4(
I2C(or(I2C(
(InterKIntegrated(Circuit(–(Philips)(
& As(with(SPI(a(masterK(
slave(system.(
& Also(called(a(2Kwire(bus.(
It(Has(only(clock(and(data,(with(pullKup(resistors((Rp(in(
diagram).(
& Lines(can(be(pulled(low(by(any(device,(and(are(high(
when(all(devices(release(them.(
& There(are(no(“slaveKselect”(lines(–(instead(the(devices(
have(“addresses”(that(are(sent(as(part(of(the(
transmission(protocol.(
& Four(max(speeds((100(kbS((standard),(400(kbS((fast),(1(
MbS((fast,plus),(and(3.4(MbS((high0speed)(
Open(Collector(
Building(an(I2C(Bus(
? If IC Output is...
– Not Driven (OFF)
The transistor is off and
looks like an open circuit
– Driven (ON)
The transistor is on, and
the bus line is tied
Example Open Collector Circuit
Author: Yan bellavance http://en.wikipedia.org/wiki/File:OpencollectorV3.png
(pulled) to ground
I2C(clock(
&
&
&
&
? If no device is driving the bus...
– They all look like open circuits
– Bus voltage is Vdd
? If any device is driving the bus...
– Current flows Vdd through RPullup
– Bus voltage is 0 V
Vdd
(3.3~5V)
RPullup
(10~100 kΩ)
I2C(transac6on(
& TransmiYer/receiver(differs(from(master/slave(
Not(a(“tradi6onal”(clock(
Normally(is(kept(“high”(using(a(pullKup(
Pulsed(by(the(master(during(data(transmission(
Master(could(be(either(the(transmiYer(or(
receiver(
– Master(ini6ates(transac6ons(
– Slave(responds(
& TransmiYer(sets(data(on(SDA(line,(slave(ACKs(
– For(a(read,(slave(is(transmiYer(
– For(a(write,(master(is(transmiYer(
– Slave(device(can(hold(clock(low(if(needs(more(6me(
& Allows(for(flow(control(
27
28
I2C(start(condi6on(
I2C(address(transmission(
& Data(is(always(sampled(on(the(rising(clock(
edge(
& Address(is(7(bits((or(10(bits)(
& An(8Kth(bit(indicated(read(or(write(
? Master pulls SDA low while SCL is high
? Normal SDA changes only happen when
SCL is low
(
– High(for(read(
– Low(for(write(
& Addresses(assigned(by(Philips/NXP(
– For(a(fee(
& Was(covered(by(patent(
29
I2C(data(transmission(
30
I2C(stop(condi6on(
& TransmiYed(just(like(address((8(bits)(
& For(a(write,(master(transmits,(slave(
acknowledges(
& For(a(read,(slave(transmits,(master(
acknowledges(
& Transmission(con6nues(
? Master pulls SDA high while SCL is high
? Also used to abort transactions
– Subsequent(bytes(sent(
– Con6nue(un6l(master(creates(stop(condi6on(
31
32
I2C(Write(a(Single(Byte(
1.
2.
3.
4.
5.
6.
7.
Other(Features(
& You(can(transfer(mul6ple(bytes(in(a(row(
(
& (
(
(
(
(
& At(any(6me,(slave(can(hold(SCL(low(to(slow(transfer(
down((called(“clockKstretching”)(
All:(allow(SDA,(SCL(start(high(
Master:(SDA(low(to(signal(start(
Master:(Send(out(SCL,(and(7(bit(address(followed(by(0((~W)(on(SDA(
Slave:(Pull(SDA(low(to(signify(ACKnowledge(
Master:(Send(out(8(data(bits(on(SDA(
Slave:(Ack(
All:(allow(SDA(to(go(high(when(SCL(is(high((stop)(
& For#“Read”,##
3. Master:(Address(following(by(1((R)(on(SDA(
5. Slave:(Send(out(8(data(bits(on(SDA(
6. Master:(Ack(
& Any(device(that(malfunc6ons(can(disable(bus.(
//
//
//
//
//
//
//
//
//
//
//
I2C(and(SCI(
I2C(Code(
The#I2C#features#include:#
& Compliance(to(Philips(I2C(specifica6on(
& Slave(receiver/transmiYer(mode(
& Standard(mode(up(to(100(kbps(and(
fast(mode(up(to(400(kbps(support(
& Programmable(UCxCLK(frequency(in(
master(mode(
& Designed(for(low(power(
& (Slave(receiver(START(detec6on(for(
autoKwake(up(from(LPMx(modes(
& (Slave(opera6on(in(LPM4(
Demo - USCI_B0 I2C Master Interface to DAC8571, Write
Description: Using UCB0TXIE, a continuous sine wave is output to
external DAC using a 16-point look-up table. Only one start
is executed. Data is handled by the ISR and the CPU is in LPM0.
MCLK = SMCLK = TACLK = BRCLK = 1MHz
DAC8571 I2C address = 0x4C (A0 = GND)
-----------------------------|XIN
P3.1/UCB0SDA|<--------------->|SDA
|
32kHz |
P3.2/UCB0SCL|---------------->|SCL I2C
|
-|XOUT
|
|
SLAVE
|
|
I2C MASTER
|
GND|A0
|
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= 0x06;
UCB0CTL1 |= UCSWRST;
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
UCB0CTL1 = UCSSEL_2 + UCSWRST;
UCB0BR0 = 11;
UCB0BR1 = 0;
UCB0I2CSA = 0x4c;
UCB0CTL1 &= ~UCSWRST;
IE2 |= UCB0TXIE;
UCB0CTL1 |= UCTR + UCTXSTT;
UCB0TXBUF = 0x10;
__bis_SR_register(CPUOFF + GIE);
}
//
//
//
//
//
//
Stop Watchdog Timer
Assign I2C pins to USCI_B0
Enable SW reset
I2C Master, synchronous mode
Use SMCLK, keep SW reset
fSCL = SMCLK/11 = 95.3kHz
//
//
//
//
//
//
Set slave address
Clear SW reset, resume operation
Enable TX ready interrupt
I2C TX, start condition
Write DAC control byte
Enter LPM0 w/ interrupts
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void) {
static unsigned char ByteCtr;
}
UCB0TXBUF = Sine_Tab[ByteCtr++];
ByteCtr &= 0x0f;
// Transmit data byte
// Do not exceed table
Soqware(UART(Implementa6on(
& A(simple(UART(implementa6on,(using(the(Capture(&(Compare(
features(of(the(Timer(to(emulate(the(UART(communica6on(
& HalfKduplex(and(rela6vely(low(baud(rate((9600(baud(recommended(
limit),(but(2400(baud(in(our(code((1(MHz(DCO(and(no(crystal)(
& BitK6me((how(many(clock(6cks(one(baud(is)(is(calculated(based(on(the(
6mer(clock(&(the(baud(rate(
& One(CCR(register(is(set(up(to(TX(in(Timer(Compare(mode,(toggling(
based(on(whether(the(corresponding(bit(is(0(or(1(
& The(other(CCR(register(is(set(up(to(RX(in(Timer(Capture(mode,(similar(
principle(
& The(func6ons(are(set(up(to(TX(or(RX(a(single(byte((8Kbit)(appended(by(
the(start(bit(&(stop(bit(
USB(COM(Port(Communica6on(
& Emula6on(hardware(implements(emula6on(features(as(well(
as(a(serial(communica6ons(port(
& Recognized(by(Windows(as(part(of(composite(driver(
& UART(Tx/Rx(pins(match(SpyKBiKWire(JTAG(interface(pins(
Applica6on(note:((hYp://focus.6.com/lit/an/slaa078a/slaa078a.pdf((
HI,(LO,(IN(
Two bus configuration models
Sources(
& Prabal Dutta/Pat Pannuto – EECS373
– hYp://web.eecs.umich.edu/~prabal/teaching/
eecs373Kf11/slides/lec10.ppt(
& Erik(Cheever(–(Engineering(91(
– hYp://www.swarthmore.edu/NatSci/echeeve1/
Class/e91/Lectures/E91(10)Serial.pdf(
& TI(MSP430(Workshop(
Some wires have been renamed
Master and multiple independent
slaves
Master and multiple daisychained slaves
http://www.maxim-ic.com/appnotes.cfm/an_pk/3947
http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/
SPI_three_slaves.svg/350px-SPI_three_slaves.svg.png
40
I2C uses
I2C bus transactions: data transfer
? Originally used by Philips inside television sets
? Now a very common peripheral bus standard
? Intended for use in embedded systems
? Philips, National, Xicor, Siemens, … all use
? Also used in PCs
? RTC
? Temperature sensors
? Variant is the SMBus (system management bus)
41
Multi-Master Arbitration
(Bus Contention)
? What does it mean to be multi-master?
? How do we actually make that work?
42
I2C Scales...
?
?
?
?
I2C
Standardizes peripheral classes
SCK, SDA
Philips/NXP
? What other features does this allow?
– Clock stretching
– Repeated start
44