Rev 1 | Rev 41 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 24 | ||
---|---|---|---|
Line 52... | Line 52... | ||
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
52 | // + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
53 | // + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
53 | // + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
54 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
54 | // + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
55 | // + POSSIBILITY OF SUCH DAMAGE. |
55 | // + POSSIBILITY OF SUCH DAMAGE. |
56 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
56 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
57 | #include "main.h" |
57 | #include "91x_lib.h" |
Line 58... | Line 58... | ||
58 | 58 | ||
59 | //________________________________________________________________________________________________________________________________________ |
59 | //________________________________________________________________________________________________________________________________________ |
60 | // Module name: fat16.c |
60 | // Module name: ssc.c |
61 | // Compiler used: avr-gcc 3.4.5 |
61 | // Compiler used: avr-gcc 3.4.5 |
62 | // Last Modifikation: 24.07.2007 |
62 | // Last Modifikation: 24.07.2007 |
63 | // Version: 1.02 |
63 | // Version: 1.02 |
64 | // Authors: Stephan Busker |
64 | // Authors: Stephan Busker |
65 | // Description: Source files for access to the synchrnous serial channel. |
65 | // Description: Source files for access to the synchrnous serial channel. |
66 | // Copyright (C) 2007 Stephan Busker |
66 | // Copyright (C) 2007 Stephan Busker |
67 | //........................................................................................................................................ |
67 | //........................................................................................................................................ |
68 | // Functions: extern void SSC_Init(void); |
68 | // ext. Functions: extern void SSC_Init(void); |
69 | // extern u8 SSC_GetChar (void); |
69 | // extern u8 SSC_GetChar (void); |
70 | // extern void SSC_PutChar (u8 Byte); |
70 | // extern void SSC_PutChar (u8 Byte); |
71 | // extern void SSC_Disable(void); |
71 | // extern void SSC_Disable(void); |
- | 72 | // extern void SSC_Enable(void); |
|
72 | // extern void SSC_Enable(void); |
73 | // extern void SSC_ClearRxFifo(); |
73 | //........................................................................................................................................ |
- | |
74 | // ext. functions: extern u8 SDC_GetSector (unsigned long,u8 *); |
- | |
75 | // extern u8 SDC_PutSector (unsigned long,u8 *); |
- | |
76 | //........................................................................................................................................ |
- | |
77 | // |
74 | //........................................................................................................................................ |
78 | // URL: www.Mikro-Control.de |
75 | // URL: www.Mikro-Control.de |
79 | // mailto: stephan.busker@mikro-control.de |
76 | // mailto: stephan.busker@mikro-control.de |
Line -... | Line 77... | ||
- | 77 | //________________________________________________________________________________________________________________________________________ |
|
- | 78 | ||
- | 79 | ||
- | 80 | ||
- | 81 | //________________________________________________________________________________________________________________________________________ |
|
- | 82 | // Function: SSC_Enable(void); |
|
- | 83 | // |
|
- | 84 | // Description: This function enables chipselect of the sdcard (active low) |
|
- | 85 | // |
|
- | 86 | // |
|
- | 87 | // Returnvalue: none |
|
- | 88 | //________________________________________________________________________________________________________________________________________ |
|
- | 89 | ||
- | 90 | void SSC_Enable(void) |
|
Line 80... | Line 91... | ||
80 | //________________________________________________________________________________________________________________________________________ |
91 | { |
81 | 92 | // enable chipselect of the sd-card (P5.4 -> SD-CS, active low). |
|
82 | 93 | GPIO_WriteBit(GPIO5, GPIO_Pin_4 , Bit_RESET); |
|
83 | 94 | } |
|
84 | 95 | ||
85 | //________________________________________________________________________________________________________________________________________ |
96 | //________________________________________________________________________________________________________________________________________ |
86 | // Funtion: SSC_Init(void); |
97 | // Function: SSC_Disable(void); |
87 | // |
98 | // |
Line 88... | Line 99... | ||
88 | // Description: This function initialises the synchronus serial channel to the sdcard. |
99 | // Description: This function disables chipselect of the sdcard (active low) |
89 | // |
100 | // |
- | 101 | // |
|
- | 102 | // Returnvalue: none |
|
- | 103 | //________________________________________________________________________________________________________________________________________ |
|
- | 104 | ||
Line -... | Line 105... | ||
- | 105 | void SSC_Disable(void) |
|
90 | // |
106 | { |
- | 107 | // disable chipselect of the sd-card (P5.4 -> SD-CS, active low). |
|
- | 108 | GPIO_WriteBit(GPIO5, GPIO_Pin_4 , Bit_SET); |
|
- | 109 | } |
|
- | 110 | ||
- | 111 | ||
- | 112 | //________________________________________________________________________________________________________________________________________ |
|
Line -... | Line 113... | ||
- | 113 | // Function: SSC_Init(void); |
|
- | 114 | // |
|
91 | // Returnvalue: none |
115 | // Description: This function initialises the synchronus serial channel to the sdcard. |
92 | //________________________________________________________________________________________________________________________________________ |
116 | // |
93 | - | ||
- | 117 | // |
|
- | 118 | // Returnvalue: none |
|
94 | void SSC_Init(void) |
119 | //________________________________________________________________________________________________________________________________________ |
95 | { |
- | |
96 | - | ||
97 | SerialPutString("SPI1 init..."); |
- | |
98 | - | ||
99 | GPIO_InitTypeDef GPIO_InitStructure; |
- | |
100 | SSP_InitTypeDef SSP_InitStructure; |
- | |
101 | 120 | ||
102 | SCU_APBPeriphClockConfig(__SSP1 ,ENABLE); |
- | |
103 | - | ||
104 | // GPIO_DeInit(GPIO2); |
121 | void SSC_Init(void) |
105 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
122 | { |
106 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; |
123 | GPIO_InitTypeDef GPIO_InitStructure; |
107 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
124 | SSP_InitTypeDef SSP_InitStructure; |
108 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; |
125 | WIU_InitTypeDef WIU_InitStructure; |
109 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; |
126 | // enable APB clock for SPI1 |
- | 127 | SCU_APBPeriphClockConfig(__SSP1 ,ENABLE); |
|
- | 128 | // configure P5.4 -> SD-CS as an output pin |
|
- | 129 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
|
- | 130 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; |
|
- | 131 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
|
- | 132 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
|
110 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
- | |
- | 133 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1; |
|
- | 134 | GPIO_Init (GPIO5, &GPIO_InitStructure); |
|
111 | 135 | // configure P3.4 -> SCK1 and P3.6 -> MOSI1 as an output pin |
|
112 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
136 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
113 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; |
137 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; |
114 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
138 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
115 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
139 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; |
116 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1; |
140 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; |
117 | GPIO_Init (GPIO5, &GPIO_InitStructure); |
- | |
- | 141 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
|
118 | 142 | // configure P3.5 <- MISO1 as an input pin |
|
119 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
143 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
120 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; |
144 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; |
121 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
145 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
122 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; |
146 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; |
123 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
147 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
- | 148 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
|
124 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
149 | // configure SPI1 |
- | 150 | SSP_DeInit(SSP1); |
|
125 | 151 | SSP_StructInit(&SSP_InitStructure); |
|
126 | SSP_DeInit(SSP1); |
152 | SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola; |
127 | SSP_StructInit(&SSP_InitStructure); |
153 | SSP_InitStructure.SSP_Mode = SSP_Mode_Master; |
128 | SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola; |
154 | SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge; |
129 | SSP_InitStructure.SSP_Mode = SSP_Mode_Master; |
155 | SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low; |
130 | SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge; |
- | |
131 | SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low; |
- | |
132 | // Hier muss die Baudrate noch richtig eingestellt werden (mit Prescaler) |
- | |
133 | SSP_InitStructure.SSP_ClockRate = 5; |
- | |
134 | SSP_InitStructure.SSP_ClockPrescaler = 8; |
- | |
135 | SSP_Init(SSP1, &SSP_InitStructure); |
- | |
136 | SSC_Disable(); |
- | |
137 | SSP_Cmd(SSP1, ENABLE); |
- | |
138 | /* MMC_Direction_REG &=~(1<<SPI_DI); // Set the direction of the ssc-port |
- | |
Line 139... | Line 156... | ||
139 | MMC_Direction_REG |= (1<<SPI_Clock); // _______ _______ |
156 | // Set Baud Rate (Prescaler) |
- | 157 | // bit rate is BRCLK/SSP_ClockPrescaler/(1+SSP_ClockRate)) |
|
140 | MMC_Direction_REG |= (1<<SPI_DO); // CS \________________________/ |
158 | // With MSCLK = 48MHz/2 = BRCLK we get for the SPICLK = 24Mhz / 8 / (1+5) = 500 kHz |
141 | MMC_Direction_REG |= (1<<MMC_Chip_Select); // |
159 | SSP_InitStructure.SSP_ClockRate = 14; //5 |
- | 160 | SSP_InitStructure.SSP_ClockPrescaler = 8; |
|
- | 161 | SSP_Init(SSP1, &SSP_InitStructure); |
|
- | 162 | SSC_Disable(); |
|
- | 163 | SSP_Cmd(SSP1, ENABLE); |
|
- | 164 | ||
142 | MMC_Direction_REG |= (1<<SPI_SS); // ___ ___ ___ |
165 | // Configure SD_SWITCH at pin GPIO5.3 as an external irq 11 |
Line -... | Line 166... | ||
- | 166 | ||
- | 167 | // configure the port |
|
- | 168 | SCU_APBPeriphClockConfig(__GPIO5, ENABLE); // Enable the GPIO5 Clock |
|
143 | // clk __________/ \___/ \___/ \_________ |
169 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
- | 170 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; |
|
- | 171 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
|
- | 172 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
|
- | 173 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
|
- | 174 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
|
- | 175 | ||
- | 176 | // configure the EXT11 interrupt line (P5.3) as an IRQ with the lowest priority |
|
- | 177 | SCU_APBPeriphClockConfig(__WIU, ENABLE); |
|
- | 178 | WIU_Cmd(ENABLE ); |
|
- | 179 | WIU_ClearITPendingBit(WIU_Line11); |
|
- | 180 | WIU_DeInit(); |
|
- | 181 | WIU_InitStructure.WIU_TriggerEdge = WIU_FallingEdge; |
|
- | 182 | WIU_InitStructure.WIU_Line = WIU_Line11; |
|
- | 183 | WIU_Init(&WIU_InitStructure); |
|
- | 184 | // The EXTIT1_IRQHandler() is called every time the SD-Switch is activated (falling edge) |
|
- | 185 | // by inserting an sd-card |
|
- | 186 | SCU_WakeUpLineConfig(11); |
|
- | 187 | VIC_Config(EXTIT1_ITLine, VIC_IRQ, 7); |
|
- | 188 | VIC_ITCmd(EXTIT1_ITLine, ENABLE); |
|
- | 189 | } |
|
- | 190 | ||
- | 191 | void SSC_Deinit(void) |
|
- | 192 | { |
|
- | 193 | GPIO_InitTypeDef GPIO_InitStructure; |
|
- | 194 | ||
- | 195 | SSP_Cmd(SSP1, DISABLE); |
|
- | 196 | SSP_DeInit(SSP1); |
|
- | 197 | ||
- | 198 | // configure P5.4 -> SD-CS as an input pin |
|
- | 199 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
|
- | 200 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; |
|
- | 201 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
|
- | 202 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
|
- | 203 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
|
- | 204 | GPIO_Init (GPIO5, &GPIO_InitStructure); |
|
- | 205 | // configure P3.4 -> SCK1 and P3.6 -> MOSI1 as an input pin |
|
- | 206 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
|
- | 207 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; |
|
- | 208 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
|
- | 209 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
|
- | 210 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
|
- | 211 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
|
- | 212 | // configure P3.5 <- MISO1 as an input pin |
|
- | 213 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
|
- | 214 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; |
|
- | 215 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
|
- | 216 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
|
- | 217 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
|
- | 218 | GPIO_Init (GPIO3, &GPIO_InitStructure); |
|
- | 219 | ||
- | 220 | // disable APB clock for SPI1 |
|
144 | // |
221 | SCU_APBPeriphClockConfig(__SSP1 ,DISABLE); |
Line 145... | Line 222... | ||
145 | // ___ ___ |
222 | |
146 | // data_________/ \___________/ \___________ |
223 | // configure the port of the SDC-Switch |
147 | 224 | SCU_APBPeriphClockConfig(__GPIO5, ENABLE); // Enable the GPIO5 Clock |
|
148 | // initialise ssc, clock = Idel low |
225 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
149 | // devide clock by 32 |
226 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; |
150 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPOL); // Enable SSC in mastermode, invert clockpolarity (idle high) |
227 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
151 | SPSR = SPSR|(1<<SPI2X);*/ |
228 | GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable; |
152 | 229 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
|
Line 153... | Line 230... | ||
153 | SerialPutString("ok\n\r"); |
230 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
154 | } |
231 | } |
155 | 232 | ||
156 | - | ||
157 | //________________________________________________________________________________________________________________________________________ |
- | |
158 | // Funtion: SSC_GetChar(void); |
233 | |
159 | // |
- | |
160 | // Description: This function reads one byte from the SSC |
234 | //________________________________________________________________________________________________________________________________________ |
161 | // |
235 | // Function: SSC_GetChar(void); |
162 | // |
- | |
163 | // Returnvalue: the byte received. |
- | |
164 | //________________________________________________________________________________________________________________________________________ |
236 | // |
165 | 237 | // Description: This function reads one byte from the SSC |
|
166 | u8 SSC_GetChar (void) |
- | |
167 | { |
238 | // |
Line 168... | Line 239... | ||
168 | u8 Byte = 0; |
239 | // |
169 | // SerialPutString("\n\rGetChar."); |
240 | // Returnvalue: the byte received. |
170 | SSP_SendData(SSP1, 0xFF); |
241 | //________________________________________________________________________________________________________________________________________ |
171 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoEmpty) != SET); |
242 | |
172 | Byte = SSP_ReceiveData(SSP1); |
243 | u8 SSC_GetChar (void) |
- | 244 | { |
|
173 | /* SPDR = 0x00; // read one byte of data from the SSC |
245 | u8 Byte = 0; |
174 | while(!(SPSR & (1<<SPIF))){}; // wait until the data has been read. |
- | |
175 | Byte = SPDR; |
246 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoNotFull) != SET); // wait for space in the tx fifo |
176 | */ |
247 | SSP_SendData(SSP1, 0xFF);// send dymmy byte (0xFF) as master to receive a byte from the slave |
177 | // sprintf(text," %02X ", Byte); SerialPutString(text);SerialPutString("done."); |
248 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoEmpty) != SET); // wait for the byte to be sent |
178 | return (Byte); |
249 | Byte = SSP_ReceiveData(SSP1); // read the byte transmitted from the slave |
179 | 250 | return (Byte); |
|
180 | } |
251 | } |
181 | 252 | ||
182 | //________________________________________________________________________________________________________________________________________ |
253 | //________________________________________________________________________________________________________________________________________ |
183 | void SSC_ClearRxFifo (void) |
254 | void SSC_ClearRxFifo (void) |
Line 184... | Line 255... | ||
184 | { |
255 | { |
185 | // SerialPutString("\n\rClr RxFifo "); |
256 | // wait that the tx fifo is empty |
186 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoEmpty) != SET); |
257 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoEmpty) != SET); |
187 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_RxFifoNotEmpty) == SET) SSP_ReceiveData(SSP1); |
258 | // then empty the rx fifo by reading all the bytes that are available |
- | 259 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_RxFifoNotEmpty) == SET) SSP_ReceiveData(SSP1); |
|
188 | // SerialPutString("done."); |
260 | } |
189 | } |
- | |
190 | //________________________________________________________________________________________________________________________________________ |
- | |
191 | // Funtion: SSC_PutChar(u8 Byte); |
261 | //________________________________________________________________________________________________________________________________________ |
Line 192... | Line -... | ||
192 | // |
- | |
193 | // Description: This function writes one byte to the SSC |
- | |
194 | // |
- | |
195 | // |
- | |
196 | // Returnvalue: none |
- | |
197 | //________________________________________________________________________________________________________________________________________ |
- | |
198 | - | ||
199 | void SSC_PutChar (u8 Byte) |
- | |
Line 200... | Line -... | ||
200 | { |
- | |
201 | //SerialPutString("\n\rPutChar."); sprintf(text," %02X ", Byte); SerialPutString(text); |
- | |
202 | while(SSP_GetFlagStatus(SSP1, SSP_FLAG_TxFifoNotFull) != SET); |
- | |
203 | SSP_SendData(SSP1, Byte); |
- | |
204 | //SerialPutString("done."); |
- | |
Line 205... | Line -... | ||
205 | - | ||
206 | } |
- | |
207 | - | ||
208 | - | ||
209 | //________________________________________________________________________________________________________________________________________ |
- | |
210 | // Funtion: SSC_Disable(void); |
- | |
211 | // |
- | |
212 | // Description: This function enables chipselect of the sdcard (active low) |
- | |
Line 213... | Line -... | ||
213 | // |
- | |
214 | // |
- | |
215 | // Returnvalue: none |
- | |
216 | //________________________________________________________________________________________________________________________________________ |
- | |
217 | - |