OpenCores
URL https://opencores.org/ocsvn/tiny_spi/tiny_spi/trunk

Subversion Repositories tiny_spi

[/] [tiny_spi/] [trunk/] [README] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 hippo5329
OpenCores tiny SPI
2
 
3
Author(s):
4
  - Thomas Chou 
5
 
6
 
7
This is an 8 bits SPI master controller. It features optional
8
programmable baud rate and SPI mode selection. Altera SPI doesn't
9
support programmable rate which is needed for MMC SPI, nor does
10
Xilinx SPI.
11
 
12
It is small. It combines transmit and receive buffer and remove unused
13
functions. It takes only 36 LEs for SPI flash controller, or 53 LEs for
14
MMC SPI controller in an Altera CycoloneIII SOPC project. While Altera
15
SPI takes around 143 LEs. OpenCores SPI takes 857 LEs and simple SPI
16
takes 171 LEs.
17
 
18
It doesn't generate SS_n signal. Please use gpio core for SS_n, which
19
costs 3- LEs per pin. The gpio number is used for the cs number in
20
u-boot and linux drivers.
21
 
22
 
23
Parameters:
24
 
25
BAUD_WIDTH: bits width of programmable divider
26
  sclk = clk / ((baud_reg + 1) * 2)
27
  if BAUD_DIV is not zero, BAUD_WIDTH is ignored.
28
 
29
BAUD_DIV: fixed divider, must be even
30
  sclk = clk / BAUD_DIV
31
 
32
SPI_MODE: value 0-3 fixed mode CPOL,CPHA
33
          otherwise (eg, 4) programmable mode in control reg[1:0]
34
 
35
Registers map:
36
 
37
base+0  R shift register
38
base+4  R buffer register
39
        W buffer register
40
base+8  R status
41
          [1] TXR transfer ready
42
          [0] TXE transter end
43
        W irq enable
44
          [1] TXR_EN transfer ready irq enable
45
          [0] TXE_EN transter end irq enable
46
base+12 W control (optional)
47
          [1:0] spi mode
48
base+16 W baud divider (optional)
49
 
50
Program flow:
51
 
52
There is an 8-bits shift register and buffer register.
53
 
54
1. after reset or idle, TXR=1, TXE=1
55
2. first byte written to buffer register, TXR=0, TXE=1
56
3. buffer register swabbed with shift register, TXR=1, TXE=0
57
   shift register has the first byte and starts shifting
58
   buffer register has (useless) old byte of shift register
59
4. second byte written to buffer register, TXR=0, TXE=0
60
5. first byte shifted,
61
   buffer register swabbed with shift register, TXR=1, TXE=0
62
   shift register has the second byte and starts shifting
63
   buffer register has the first received byte from shift register
64
6. third byte written to buffer register, TXR=0, TXE=0
65
7. repeat like 5.
66
 
67
9. last byte written to buffer register, TXR=0, TXE=0
68
10. last-1 byte shifted,
69
   buffer register swabbed with shift register, TXR=1, TXE=0
70
   shift register has the last byte and starts shifting
71
   buffer register has the last-1 received byte from shift register
72
11. last byte shifted, no more to write, TXR=1, TXE=1
73
   shift register has the last received byte
74
 
75
Interrupt usage:
76
Interrupt is controlled with irq enable reg.
77
 
78
For performace issue, at sclk > 200KHz, interrupt should not be used and
79
polling will get better result. In this case, interrupt can be
80
disconnected in SOPC builder to save 2 LEs. A 100MHz Nios2 is able to
81
serve 25 MHz sclk using polling.
82
 
83
This core uses zero-wait bus access. Clock crossing bridges between
84
CPU and this core might reduce performance.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.