Paparazzi UAS  v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
eeprom25AA256.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Gautier Hattenberger
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, see
18  * <http://www.gnu.org/licenses/>.
19  *
20  */
21 
32 
35 typedef enum {
36  EEPROM_READ = 0x3,
37  EEPROM_WRITE = 0x2,
38  EEPROM_WRDI = 0x4,
39  EEPROM_WREN = 0x6,
40  EEPROM_RDSR = 0x5,
43 
44 // Init function
45 void eeprom25AA256_init(struct Eeprom25AA256 *eeprom, struct spi_periph *spi_p, uint8_t slave_idx)
46 {
47  /* set spi_peripheral */
48  eeprom->spi_p = spi_p;
49 
50  /* configure spi transaction */
51  eeprom->spi_trans.cpol = SPICpolIdleLow;
52  eeprom->spi_trans.cpha = SPICphaEdge1;
53  eeprom->spi_trans.dss = SPIDss8bit;
54  eeprom->spi_trans.bitorder = SPIMSBFirst;
55  eeprom->spi_trans.cdiv = SPIDiv128; // f_PCLK / div
56 
58  eeprom->spi_trans.slave_idx = slave_idx;
59  eeprom->spi_trans.output_length = 0;
60  eeprom->spi_trans.input_length = 0;
61  eeprom->spi_trans.before_cb = NULL;
62  eeprom->spi_trans.after_cb = NULL;
63  eeprom->spi_trans.input_buf = &(eeprom->rx_buf[0]);
64  eeprom->spi_trans.output_buf = &(eeprom->tx_buf[0]);
65 
66  /* set inital status: Success or Done */
67  eeprom->spi_trans.status = SPITransDone;
68 
69 }
70 
71 // Read data
72 void eeprom25AA256_read(struct Eeprom25AA256 *eeprom, uint16_t addr, uint16_t length)
73 {
74  if (E25_OUT_BUFFER_LEN < 3 || E25_IN_BUFFER_LEN < (length + 3)) {
75  return; // Buffer or too small
76  }
77  eeprom->tx_buf[0] = EEPROM_READ;
78  eeprom->tx_buf[1] = (addr >> 8) & 0xff;
79  eeprom->tx_buf[2] = addr & 0xff;
80 
81  if (eeprom->spi_trans.status == SPITransDone) {
82  eeprom->spi_trans.output_length = 3;
83  eeprom->spi_trans.input_length = length + 3;
84  spi_submit(eeprom->spi_p, &(eeprom->spi_trans));
85  }
86 }
87 
88 // Check end of transaction
89 void eeprom25AA256_event(struct Eeprom25AA256 *eeprom)
90 {
91  // TODO better report status
92  if (eeprom->spi_trans.status == SPITransFailed) {
93  // Fail reading
94  eeprom->spi_trans.status = SPITransDone;
95  } else if (eeprom->spi_trans.status == SPITransSuccess) {
96  // Successfull reading
97  eeprom->data_available = true;
98  eeprom->spi_trans.status = SPITransDone;
99  }
100 }
101 
uint16_t
unsigned short uint16_t
Definition: types.h:16
spi_transaction::cdiv
enum SPIClockDiv cdiv
prescaler of main clock to use as SPI clock
Definition: spi.h:159
eeprom25AA256_init
void eeprom25AA256_init(struct Eeprom25AA256 *eeprom, struct spi_periph *spi_p, uint8_t slave_idx)
Init function.
Definition: eeprom25AA256.c:45
spi_transaction::cpol
enum SPIClockPolarity cpol
clock polarity control
Definition: spi.h:155
Eeprom25AA256::spi_trans
struct spi_transaction spi_trans
spi transaction
Definition: eeprom25AA256.h:59
eeprom25AA256_read
void eeprom25AA256_read(struct Eeprom25AA256 *eeprom, uint16_t addr, uint16_t length)
Read function.
Definition: eeprom25AA256.c:72
spi_transaction::output_length
uint16_t output_length
number of data words to write
Definition: spi.h:152
Eeprom25AA256InstructionSet
Eeprom25AA256InstructionSet
Instruction set.
Definition: eeprom25AA256.c:35
EEPROM_WRITE
@ EEPROM_WRITE
Definition: eeprom25AA256.c:37
Eeprom25AA256::spi_p
struct spi_periph * spi_p
spi peripheral
Definition: eeprom25AA256.h:58
EEPROM_WREN
@ EEPROM_WREN
Definition: eeprom25AA256.c:39
Eeprom25AA256::data_available
bool data_available
data read flag
Definition: eeprom25AA256.h:62
eeprom25AA256_event
void eeprom25AA256_event(struct Eeprom25AA256 *eeprom)
Event function.
Definition: eeprom25AA256.c:89
SPISelectUnselect
@ SPISelectUnselect
slave is selected before transaction and unselected after
Definition: spi.h:63
SPITransSuccess
@ SPITransSuccess
Definition: spi.h:99
spi_transaction::bitorder
enum SPIBitOrder bitorder
MSB/LSB order.
Definition: spi.h:158
E25_OUT_BUFFER_LEN
#define E25_OUT_BUFFER_LEN
Output buffer length.
Definition: eeprom25AA256.h:52
EEPROM_RDSR
@ EEPROM_RDSR
Definition: eeprom25AA256.c:40
spi_transaction::output_buf
volatile uint8_t * output_buf
pointer to transmit buffer for DMA
Definition: spi.h:150
spi_periph
SPI peripheral structure.
Definition: spi.h:174
spi_transaction::select
enum SPISlaveSelect select
slave selection behavior
Definition: spi.h:154
SPICphaEdge1
@ SPICphaEdge1
CPHA = 0.
Definition: spi.h:74
SPIMSBFirst
@ SPIMSBFirst
Definition: spi.h:112
SPICpolIdleLow
@ SPICpolIdleLow
CPOL = 0.
Definition: spi.h:83
spi_transaction::cpha
enum SPIClockPhase cpha
clock phase control
Definition: spi.h:156
spi_transaction::after_cb
SPICallback after_cb
NULL or function called after the transaction.
Definition: spi.h:161
spi_submit
bool spi_submit(struct spi_periph *p, struct spi_transaction *t)
Submit SPI transaction.
Definition: spi_arch.c:511
SPITransFailed
@ SPITransFailed
Definition: spi.h:100
SPIDiv128
@ SPIDiv128
Definition: spi.h:126
E25_IN_BUFFER_LEN
#define E25_IN_BUFFER_LEN
Input buffer length.
Definition: eeprom25AA256.h:43
uint8_t
unsigned char uint8_t
Definition: types.h:14
EEPROM_READ
@ EEPROM_READ
Definition: eeprom25AA256.c:36
SPIDss8bit
@ SPIDss8bit
Definition: spi.h:90
EEPROM_WRDI
@ EEPROM_WRDI
Definition: eeprom25AA256.c:38
spi_transaction::input_length
uint16_t input_length
number of data words to read
Definition: spi.h:151
Eeprom25AA256
25AA256 eeprom structure
Definition: eeprom25AA256.h:57
spi_transaction::dss
enum SPIDataSizeSelect dss
data transfer word size
Definition: spi.h:157
spi_transaction::slave_idx
uint8_t slave_idx
slave id: SPI_SLAVE0 to SPI_SLAVE4
Definition: spi.h:153
SPITransDone
@ SPITransDone
Definition: spi.h:101
spi_transaction::input_buf
volatile uint8_t * input_buf
pointer to receive buffer for DMA
Definition: spi.h:149
Eeprom25AA256::rx_buf
volatile uint8_t rx_buf[E25_IN_BUFFER_LEN]
receive buffer
Definition: eeprom25AA256.h:61
Eeprom25AA256::tx_buf
volatile uint8_t tx_buf[E25_OUT_BUFFER_LEN]
transmit buffer
Definition: eeprom25AA256.h:60
spi_transaction::before_cb
SPICallback before_cb
NULL or function called before the transaction.
Definition: spi.h:160
eeprom25AA256.h
spi_transaction::status
enum SPITransactionStatus status
Definition: spi.h:162
EEPROM_WRSR
@ EEPROM_WRSR
Definition: eeprom25AA256.c:41