SPI introduction and LCD introduction

Download Report

Transcript SPI introduction and LCD introduction

Developing a bicycle speed-o-meter
Midterm Review
General Project concept
Magnetic Sensor Signal
High speed clock signal
2
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Blackfin
Programmable
Flag (PF) Input
Motorola
Parallel
Interface
Timer (PIT)
Input
Main function concept
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency)
#define ulong unsigned long int;
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
extern “C” void SetupInterface(void);
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) {
// Get to known position on magnetic sensor signal
unsigned long discard_count;
unsigned long count_high, count_low;
SetupInterface( );
discard_count = CountClockASM(while_MagneticSensorHigh);
discard_count = CountClockASM(while_MagneticSensorLow);
3
count_high = CountClockASM(while_MagneticSensorHigh);
count_low = CountClockASM(while_MagneticSensorLow);
return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency);
}
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Required Assembly Language
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” void SetupInterface(void);
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
ulong CountClockASM(const int high_low) {
ulong clock_count = 0;
while (magnetic_sensor = = high_low) { // if signal is unchanged from start
// Must count just one clock signal low-to-high transition
while (clock_signal = = high) /* wait */;
while (clock_signal = = low) /* wait */; // Changes on low-to-high edge
clock_count++;
}
return clock_count;
}
4
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
What we need to know







5
How can you pass parameters between “C/C++” and assembly
code functions?
How can you return a parameter from assembly code
functions?
What registers are available on the processor?
How do you set up the interface between the processor and the
real world
Many signals are coming into processor, how do you separate
(mask off) the signals you want from those you don’t?
What are the basic operations for accessing memory?
What are the basic ALU operations for this processor?
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Programming model
Blackfin
Data Registers
R0, R1 …. R7
Address Registers
6
Pointer Registers
P0, P1 … P5
Frame Buffer
FP
Stack Pointer
SP
Special DSP
I0-I3, B0-B3, M0-M3, L0-L3
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Syntax examples
Blackfin
Register to Register Move
reg1  reg 2
32 bit operations
R1 = R2;
(1 cycle @ 500 MHz)
Register to Register Move
reg1  reg 2
16 bit operations
R1.L = R2.L; and also
R1.H = R2.L;
Register to Register Move
reg1  reg 2
8 bit operations
Here is some new syntax
7
7/17/2015
R1 = R2.B (X);
R1.L = R2.B(Z);
R1 = R2.B(X);
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Syntax examples
Blackfin
8
Register to Register ADD
reg1  reg 2 + reg3
32 bit operations
R1 = R2 + R3;
(1 cycle @ 500 MHz)
Register to Register Move
reg1  reg 2 + reg3
16 bit operations
R1.L = R2.L + R3.L (NS);
(1 cycle @ 500 MHz)
Also R1 = R2 +|- R3;
Means R1.L = R2.L – R3.L;
and R1.H = R2.H + R3.H;
Register to Register Move
reg1  reg 2 + reg3 8 bit
operations
R1.L = R2.B (X);
R0.L = R3.B (X);
R1.L = R1.L + R0.L (NS);
( > 3 cycles @ 500 MHz)
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
32-bit Memory Move operations
Blackfin
Value at memory location 1
placed at memory location 2
Multiple moves
9
7/17/2015
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = [P0];
[P1] = R0; > 6 cycles
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = [P0++];
[P1++] = R0;
R0 = [P0++];
[P1++] = R0;
R0 = [P0++];
[P1++] = R0;,
Motorola Blackfin Comparison Part 1
Copyright M. Smith, ECE, University of Calgary, Canada
16-bit Memory Move operations
Blackfin
Value at memory location 1
placed at memory location 2
Multiple moves
10
7/17/2015
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 =W [P0];
W[P1] = R0; > 6 cycles
P0.H = hi(MEM1);
P0.L = lo(MEM1);
P1.H = hi(MEM2);
P1.L = lo(MEM2);
R0 = W[P0++] (X);
W [P1++] = R0;
R0 = W[P0++] (X);
W[P1++] = R0;
R0 =W [P0++] (X);
W [P1++] = R0;
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Memory Move operations
Blackfin
Multiple moves of
registers
[- - SP] = (R7:5, P5:3);
Combination of memory
moves and ALU
operations
Can also do parallel read and write
operations together with math operations
Syntax looks like this
R1 = R2 | | R3 = [I0++] | | [I1++] = R4;
Not all operations can be made parallel
11
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
If – then – else constructs
Signed tests
Blackfin
Set the condition
code register
CC = D1 == D0;
CC = D1 < D0;
CC = D1 <= D0;
Conditional jump
IF CC JUMP NEXT_INSTR
IF !CC JUMP NEXT_INSTR
12
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
If – then – else constructs
Un-signed tests
Blackfin
Set the condition
code register
CC = D1 == D0 (IU);
CC = D1 < D0 (IU);
CC = D1 <= D0 (IU);
Conditional jump
IF CC JUMP NEXT_INSTR
IF !CC JUMP NEXT_INSTR
13
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example if-then-else code
C++ example
Blackfin
Set A, B, C, D, E
to registers R0, R1, .. R4
IF (A > B) C = D;
ELSE C = E;
CC = R1 < R0;
IF !CC JUMP ELSE;
R2 = R3;
JUMP END_IF;
ELSE: R2 = R4;
END_IF:
CC = R1 < R0;
IF CC R2 = R3;
IF !CC R2 = R4;
14
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example loop code -- software loop
C++ example
sum = 0;
for (loop = 0; loop < 6; loop++)
sum = sum + loop;
15
7/17/2015
Blackfin
Set R0 = sum , R1 = loop
R0 = 0;
R1 = 0;
R2 = 6;
LOOP: CC = R2 <= R1;
IF !CC JUMP PAST_LOOP;
R0 = R0 + R1;
R1 += 1;
JUMP LOOP
PAST_LOOP:
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Example loop code -- Harware loop
C++ example
sum = 0;
for (loop = 0; loop < 6; loop++)
sum = sum + loop;
Blackfin
Set R0 = sum , R1 = loop
R0 = 0;
R1 = 0;
P1 = 6;
LSETUP(LSTART, LEND) LC1 = P1;
LSTART:
R0 = R0 + R1;
LEND:
R1 += 1;
PAST_LOOP:
Has a capability of 2 hardware (highspeed, zero overhead) loop
16
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
General Project concept
Magnetic Sensor Signal
High speed clock signal
17
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Blackfin
Programmable
Flag (PF) Input
Motorola
Parallel
Interface
Timer (PIT)
Input
Hardware test – wait while magnetic
signal is “high”
C++
Magnetic Signal
Blackfin
Bit 10 of FIO_FLAG_D
register of PF interface
#define MASK 0x400
while
(mag_signal ==
HIGH)
/* wait */ ;
18
7/17/2015
P0.H = hi(FIO_FLAG_D);
P0.L = lo(FIO_FLAG_D);
R1 = MASK;
WHILE:
R0 = W[P0] (Z);
R0 = R0 & R1;
CC = R0 == R1;
IF CC JUMP WHILE (BP);
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Required Assembly Language
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” void SetupInterface(void);
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
ulong CountClockASM(const int high_low) {
ulong clock_count = 0;
while (magnetic_sensor = = high_low) { // if signal is unchanged from start
// Must count just one clock signal low-to-high transition
while (clock_signal = = high) /* wait */;
while (clock_signal = = low) /* wait */; // Changes on low-to-high edge
clock_count++;
}
return clock_count;
}
19
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Required BF533 Assembly Language
ulong CountClockASM(const int high_low) {
ulong clock_count = 0;
while (magnetic_sensor = = high_low) {
// if signal is unchanged from start
// Must count just one clock signal
// low-to-high transition
while (clock_signal = = high) /* wait */;
while (clock_signal = = low) /* wait */;
// Changes on low-to-high edge
clock_count++;
}
return clock_count;
}
20
_CountClockASM:
R0 contains the INPAR
R1 = 0;
P0.H = hi(FIO_FLAG_D); P0.L = lo(FIO_FLAG_D);
WHILE:
R2 = W[P0] (Z);
R3 = MASKMAG;
R2 = R2 & R3;
CC = R2 == R0;
IF !CC JUMP ENDWHILE;
R3 = MASKCLK;
HIGH: R2 = W[P0] (Z);
R2 = R2 & R3;
CC = R2 == R3
IF CC JUMP HIGH (BP);
LOW : R2 = W[P0] (Z);
R2 = R2 & R3;
CC = R2 < R3
IF CC JUMP LOW (BP);
R1 += 1;
JUMP WHILE
7/17/2015
Motorola Blackfin Comparison
Part 1 R0 = R1;
,
END_WHILE:
RTS
Copyright M. Smith, ECE, University
of Calgary, Canada
Subroutine / Function calls
C++
Blackfin
extern “C”
int FooASM(int, int, int)
C = FooASM(1,2,3)
.extern _FooASM
LINK 20;
[SP + 16] = R4;
R0 = 1;
R1 = 2;
R2 = 3;
CALL _FooASM;
R4 = R0;
.. Other code
21
7/17/2015
R4 = [SP + 16];
UNLINK;
RTS;
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Code conventions for
subroutines / functions
Blackfin -- VisualDSP
22
Volatile registers
R0, R1, R2, R3
P0, P1, P2
Non-volatile registers
R4, R5, R6, R7
P3, P4, P5, FP, SP
Subroutine return value is
passed in
R0
Subroutine OUTPARS
OUTPAR1  R0
OUTPAR2  R1
OUTPAR3  R2
OUTPAR4  [SP + 12]
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Main function concept
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency)
#define ulong unsigned long int;
extern “C” ulong CountClockASM(const int);
// Assembly code interface
extern “C” ulong CalculateSpeedASM(ulong, ulong, ulong);
extern “C” void SetupInterface(void);
ulong DetermineSpeed(ulong wheelDiameter, ulong clockFrequency) {
// Get to known position on magnetic sensor signal
unsigned long discard_count;
unsigned long count_high, count_low;
SetupInterface( );
discard_count = CountClockASM(while_MagneticSensorHigh);
discard_count = CountClockASM(while_MagneticSensorLow);
23
count_high = CountClockASM(while_MagneticSensorHigh);
count_low = CountClockASM(while_MagneticSensorLow);
return CalculateSpeedASM(count_high + count_low, wheelDiameter, clockFrequency);
}
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada
Main Blackfin function concept
ulong DetermineSpeed(ulong wheelDiameter,
ulong clockFrequency) {
// Get to known position on magnetic sensor
signal
unsigned long discard_count;
unsigned long count_high, count_low;
SetupInterface( );
discard_count =
CountClockASM(while_MagneticSensorHigh);
discard_count =
CountClockASM(while_MagneticSensorLow);
count_high =
CountClockASM(while_MagneticSensorHigh);
count_low =
CountClockASM(while_MagneticSensorLow);
return
CalculateSpeedASM(count_high + count_low,
wheelDiameter, clockFrequency);
}
24
7/17/2015
_DetermineSpeed: LINK 20
[FP + 8] = R0;
[FP + 12] = R1;
// Save INPARS
[SP + 16] = R4;
CALL _SetupInterface;
R0 = MASKMAG;
CALL _CountClockASM;
R0 = 0;
CALL _CountClockASM
R0 = MASKMAG;
CALL _CountClockASM;
R4 = R0;
// count_high
R0 = 0;
CALL _CountClockASM
R0 = R0 + R4;
// high + low.
R1 = [FP + 8];
// old INPAR1
R2 = [FP + 12];
// old INPAR2
CALL _CalculateSpeedASM // Return in R0
[SP + 16] = R4;
Motorola Blackfin ComparisonUNLINK
Part 1
,
Copyright M. Smith, ECE, University
RTS of Calgary, Canada
extern “C” void SetupInterface(void);
Blackfin
Direction register
0 = input, 1 = output
FIO_DIR
16-bits
Interrupt control
FIO_MASKA_D
on any bit
Enable input
(Power save issue)
FIO_INEN
on any bit
Polarity
FIO_POLAR
on any bit
Edge / Level sensitivity
FIO_EDGE
FIO_BOTH
on any bit
Magnetic signal
Clock signal
25
7/17/2015
Bit 10 MASKMAG 0x200
Bit 11 MASKCLK 0x400
Motorola Blackfin Comparison Part 2
,
Copyright M. Smith, ECE, University of Calgary, Canada
extern “C” void SetupInterface(void);
SPECIFICS
Blackfin
Magnetic signal
Clock signal
Direction register
0 = input, 1 = output
R0  FIO_DIR
MASK OFF BITS 10, 11
FIO_DIR  R0
Interrupt control
R0  FIO_MASKA_D
MASK OFF BITS 10, 11
FIO_MASKA_D  R0
Enable input
(Power save issue)
R0  FIO_INEN
OR BITS 10, 11
FIO_INEN  R0
Polarity
R0  FIO_POLAR
MASK OFF BITS 10, 11
FIO_POLAR  R0
Edge / Level sensitivity
26
Bit 10 MASKMAG 0x200
Bit 11 MASKCLK 0x400
7/17/2015
FIO_EDGE
FIO_BOTH
MASK OFF BITS 10, 11
Motorola Blackfin Comparison Part 2
,
Copyright M. Smith, ECE, University of Calgary, Canada
In class exercise – Write Blackfin code
for extern “C” void SetupInterface(void);
27
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada

Information taken from Analog Devices On-line Manuals
with permission
http://www.analog.com/processors/resources/technicalLibrary/manuals/

28
Information furnished by Analog Devices is believed to be accurate
and reliable. However, Analog Devices assumes no responsibility for
its use or for any infringement of any patent other rights of any third
party which may result from its use. No license is granted by
implication or otherwise under any patent or patent right of Analog
Devices. Copyright  Analog Devices, Inc. All rights reserved.
7/17/2015
Motorola Blackfin Comparison Part 1
,
Copyright M. Smith, ECE, University of Calgary, Canada