1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
6 * This source code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by the
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * -------------------------------- Arctic Core ------------------------------*/
36 * General configuration
39 // Maximum amount of data that can be written/read in one go.
40 #define SPI_EB_MAX_LENGTH 64
42 // Switches the Spi_Cancel function ON or OFF.
43 #define SPI_CANCEL_API STD_OFF
45 // Selects the SPI Handler/Driver Channel Buffers usage allowed and delivered.
46 // LEVEL 0 - Only Internal buffers
47 // LEVEL 1 - Only external buffers
48 // LEVEL 2 - Both internal/external buffers
49 #define SPI_CHANNEL_BUFFERS_ALLOWED 1
51 #define SPI_DEV_ERROR_DETECT STD_ON
52 // Switches the Spi_GetHWUnitStatus function ON or OFF.
53 #define SPI_HW_STATUS_API STD_ON
54 // Switches the Interruptible Sequences handling functionality ON or OFF.
55 #define SPI_INTERRUPTIBLE_SEQ_ALLOWED STD_OFF
57 // LEVEL 0 - Simple sync
58 // LEVEL 1 - Basic async
59 // LEVEL 2 - Enhanced mode
60 #define SPI_LEVEL_DELIVERED 2
62 #define SPI_VERSION_INFO_API STD_ON
65 #if SPI_LEVEL_DELIVERED>=1
66 #define SPI_INTERRUPTIBLE_SEQ_ALLOWED STD_ON
71 #define E2_WREN 0x6 // Write Enable 0000 0110
72 #define E2_WRDI 0x4 // Write Disable 0000 0100
73 #define E2_RDSR 0x5 // Read Status Register 0000 0101
75 #define E2_WRSR 0x1 // Write Status Register 0000 0001
77 #define E2_READ 0x3 // Read from Memory Array 0000 0011
78 // 1 - Write 16-bit address
79 // n - 8 -bit read data
80 #define E2_WRITE 0x2 // WRITE Write to Memory Array 0000 0010
81 // 1 Write 16-bit address
85 #define FLASH_READ_25 0x03
86 #define FLASH_READ_50 0x0B
87 #define FLASH_RDSR 0x05
88 #define FLASH_JEDEC_ID 0x9f
89 #define FLASH_RDID 0x90
90 #define FLASH_BYTE_WRITE 0x02
91 #define FLASH_AI_WORD_WRITE 0xad
92 #define FLASH_WREN 0x06
93 #define FLASH_WRDI 0x04
94 #define FLASH_WRSR 0x01
95 #define FLASH_ERASE_4K 0x20
101 SPI_EB = 0, // External Buffer
102 SPI_IB // Internal Buffer
107 SPI_EXT_DEVICE_A_FLASH,
109 } Spi_ExternalDeviceTypeType;
147 SPI_JOB_FLASH_CMD_DATA,
158 #define SPI_MAX_CHANNELS 8
174 SPI_SEQ_FLASH_CMD_DATA,
185 SPI_ECORE_TRANSFER_START_LSB,
186 SPI_ECORE_TRANSFER_START_MSB,
187 } Spi_EcoreTransferStartType;
197 // All data needed to configure one SPI-channel
201 Spi_ChannelType SpiChannelId;
202 // Buffer usage with EB/IB channel
203 // TODO: The type is wrong...
204 unsigned SpiChannelType;
206 // This parameter is the width of a transmitted data unit.
208 // This parameter is the default value to transmit.
209 uint32 SpiDefaultData;
211 // This parameter contains the maximum size of data buffers in case of EB
212 // Channels and only.
213 Spi_NumberOfDataType SpiEbMaxLength;
215 // This parameter contains the maximum number of data buffers in case of IB
216 // Channels and only.
217 Spi_NumberOfDataType SpiIbNBuffers;
219 // This parameter defines the first starting bit for transmission.
220 Spi_EcoreTransferStartType SpiTransferStart;
223 _Bool SpiDmaNoIncreaseSrc;
225 } Spi_ChannelConfigType;
227 // All data needed to configure one SPI-Job, amongst others the connection
228 // between the internal SPI unit and the special settings for an external de-
233 Spi_JobType SpiJobId;
235 // This parameter is the symbolic name to identify the HW SPI Hardware micro-
236 // controller peripheral allocated to this Job.
239 // This parameter is a reference to a notification function.
240 void (*SpiJobEndNotification)();
242 // Priority of the Job
244 unsigned SpiJobPriority;
246 // A job references several channels.
247 uint32 ChannelAssignment[SPI_MAX_CHANNELS];
249 // Reference to the external device used by this job
250 Spi_ExternalDeviceTypeType DeviceAssignment;
252 // unsigned SPI_NUMBER_OF_CHANNELS;
253 // unsigned SPI_LIST_OF_CHANNELS[SPI_MAX_CHANNEL];
256 // The communication settings of an external device. Closely linked to Spi-
261 // This parameter is the communication baudrate - This parameter allows
262 // using a range of values, from the point of view of configuration tools, from
264 // Note! Float in config case, not here
267 // Symbolic name to identify the CS used for this job
268 uint32 SpiCsIdentifier;
270 // This parameter defines the active polarity of Chip Select.
271 // STD_HIGH or STD_LOW
274 // This parameter defines the SPI data shift edge.
275 Spi_EdgeType SpiDataShiftEdge;
277 // This parameter enables or not the Chip Select handling functions.
280 // This parameter defines the SPI shift clock idle level.
281 uint8 SpiShiftClockIdleLevel;
283 // Timing between clock and chip select - This parameter allows to use a
284 // range of values from 0 up to 100 microSec. the real configuration-value
285 // used in software BSW-SPI is calculated out of this by the generator-tools
286 // Note! Float in config case, not here. Unit ns
287 uint32 SpiTimeClk2Cs;
289 // Timing between PCS and first edge of SCK. Unit ns.
290 uint32 SpiTimeCs2Clk;
292 // Ecore extension...
293 // The controller ID(0..3)
294 //uint32 SpiControllerId;
296 } Spi_ExternalDeviceType;
298 // All data needed to configure one SPI-sequence
301 // This parameter allows or not this Sequence to be suspended by another
303 unsigned SpiInterruptibleSequence;
304 // This parameter is a reference to a notification function.
305 void (*SpiSeqEndNotification)();
307 Spi_SequenceType SpiSequenceId;
308 // unsigned SPI_NUMBER_OF_JOBS;
309 // A sequence references several jobs, which are executed during a commu-
311 uint32 JobAssignment[SPI_MAX_JOB];
312 } Spi_SequenceConfigType;
316 /* Interrupt priority level for this SPI channel. */
319 /* This channel is to be activated for use. */
322 /* Receive DMA channel. */
323 Dma_ChannelType RxDmaChannel;
325 /* Transmit DMA channel. */
326 Dma_ChannelType TxDmaChannel;
328 /* Peripheral clock source. */
329 McuE_PeriperalClock_t PeripheralClock;
334 // This parameter contains the number of Channels configured. It will be
335 // gathered by tools during the configuration stage.
340 uint8 SpiMaxSequence;
342 // All data needed to configure one SPI-channel
343 const Spi_ChannelConfigType * SpiChannelConfig;
345 // The communication settings of an external device. Closely
347 const Spi_ExternalDeviceType * SpiExternalDevice;
349 // All data needed to configure one SPI-Job, amongst others the
350 // connection between the internal SPI unit and the special set-
351 // tings for an external device is done.
352 const Spi_JobConfigType * SpiJobConfig;
354 // All data needed to configure one SPI-sequence
355 const Spi_SequenceConfigType * SpiSequenceConfig;
357 const Spi_HwConfigType *SpiHwConfig;
360 typedef Spi_DriverType Spi_ConfigType;
364 struct SpiDriverConfiguration_s
366 Spi_ChannelType SPI_MAX_CHANNEL;
367 Spi_JobType SPI_MAX_JOB;
368 Spi_SequenceType SPI_MAX_SEQUENCE;
372 // This is implementation specific but not all values may be valid
373 // within the type.This type shall be chosen in order to have the
374 // most efficient implementation on a specific microcontroller
376 // In-short: Type of application data buffer elements
377 // The 5516 TXDATA is 16-bit.. fits ?
379 typedef uint8 Spi_DataType;
380 //typedef uint16 Spi_DataType;
382 // Specifies the identification (ID) for a SPI Hardware microcontroller peripheral (unit).
383 // SPI140: This type is configurable (On / Off) at pre-compile time. The switch
384 // SPI_HW_STATUS_API shall activate or deactivate the declaration of this
386 typedef uint32 Spi_HWUnitType;
391 Spi_SequenceConfigType SpiSequenceConfig;
392 Spi_JobConfigType SpiJobConfig;
393 Spi_ChannelConfigType SpiChannelConfig;
394 Spi_ExternalDeviceType SpiExternalDevice;
398 extern const Spi_ConfigType SpiConfigData;
401 uint32 Spi_GetJobCnt(void );
402 uint32 Spi_GetChannelCnt(void );
403 uint32 Spi_GetExternalDeviceCnt(void );
407 #endif /*SPI_CFG_H_*/