Skip to content

Commit cfefee5

Browse files
committed
SPI frequency parameter
1 parent 5f2181c commit cfefee5

File tree

7 files changed

+46
-4
lines changed

7 files changed

+46
-4
lines changed

firmware/programmer/spi_flash.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ typedef struct __attribute__((__packed__))
3636
uint8_t status_cmd;
3737
uint8_t busy_bit;
3838
uint8_t busy_state;
39+
uint32_t freq;
3940
} spi_conf_t;
4041

4142
static spi_conf_t spi_conf;
@@ -105,6 +106,28 @@ static inline void spi_flash_deselect_chip()
105106
GPIO_SetBits(GPIOA, SPI_FLASH_CS_PIN);
106107
}
107108

109+
static uint16_t spi_flash_get_baud_rate_prescaler(uint32_t spi_freq_khz)
110+
{
111+
uint32_t system_clock_khz = SystemCoreClock / 1000;
112+
113+
if (spi_freq_khz >= system_clock_khz / 2)
114+
return SPI_BaudRatePrescaler_2;
115+
else if (spi_freq_khz >= system_clock_khz / 4)
116+
return SPI_BaudRatePrescaler_4;
117+
else if (spi_freq_khz >= system_clock_khz / 8)
118+
return SPI_BaudRatePrescaler_8;
119+
else if (spi_freq_khz >= system_clock_khz / 16)
120+
return SPI_BaudRatePrescaler_16;
121+
else if (spi_freq_khz >= system_clock_khz / 32)
122+
return SPI_BaudRatePrescaler_32;
123+
else if (spi_freq_khz >= system_clock_khz / 64)
124+
return SPI_BaudRatePrescaler_64;
125+
else if (spi_freq_khz >= system_clock_khz / 128)
126+
return SPI_BaudRatePrescaler_128;
127+
else
128+
return SPI_BaudRatePrescaler_256;
129+
}
130+
108131
static int spi_flash_init(void *conf, uint32_t conf_size)
109132
{
110133
SPI_InitTypeDef spi_init;
@@ -124,7 +147,8 @@ static int spi_flash_init(void *conf, uint32_t conf_size)
124147
spi_init.SPI_CPOL = SPI_CPOL_High;
125148
spi_init.SPI_CPHA = SPI_CPHA_2Edge;
126149
spi_init.SPI_NSS = SPI_NSS_Soft;
127-
spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
150+
spi_init.SPI_BaudRatePrescaler =
151+
spi_flash_get_baud_rate_prescaler(spi_conf.freq);
128152
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
129153
spi_init.SPI_CRCPolynomial = 7;
130154
SPI_Init(SPI1, &spi_init);

qt/nando_spi_chip_db.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
# name, page size, block size, total size, page off., read com., read ID com., write com., erase com., status com., Busy bit, Busy bit state, ID1, ID2, ID3, ID4, ID5
2-
AT45DB021D, 264, 2112, 270336, 9, 11, 159, 130, 80, 215, 7, 0, 31, 35, -, -, -
1+
# name, page size, block size, total size, page off., read com., read ID com., write com., erase com., status com., Busy bit, Busy bit state, Max. freq. kHz, ID1, ID2, ID3, ID4, ID5
2+
AT45DB021D, 264, 2112, 270336, 9, 11, 159, 130, 80, 215, 7, 0, 66000, 31, 35, -, -, -

qt/spi_chip_db.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class SpiChipDb : public ChipDb
4040
CHIP_PARAM_STATUS_CMD,
4141
CHIP_PARAM_BUSY_BIT,
4242
CHIP_PARAM_BUSY_STATE,
43+
CHIP_PARAM_FREQ,
4344
CHIP_PARAM_ID1,
4445
CHIP_PARAM_ID2,
4546
CHIP_PARAM_ID3,

qt/spi_chip_db_dialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ SpiChipDbDialog::SpiChipDbDialog(SpiChipDb *chipDb, QWidget *parent) :
2727
HEADER_MED_WIDTH);
2828

2929
for (int i = SpiChipDb::CHIP_PARAM_PAGE_OFF;
30-
i <= SpiChipDb::CHIP_PARAM_BUSY_STATE; i++)
30+
i <= SpiChipDb::CHIP_PARAM_FREQ; i++)
3131
{
3232
ui->chipDbTableView->setColumnWidth(i, HEADER_MED_WIDTH);
3333
}

qt/spi_chip_db_table_model.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ QVariant SpiChipDbTableModel::data(const QModelIndex &index, int role) const
7979
case SpiChipDb::CHIP_PARAM_BUSY_STATE:
8080
return chipDb->getChipParam(index.row(),
8181
SpiChipInfo::CHIP_PARAM_BUSY_STATE);
82+
case SpiChipDb::CHIP_PARAM_FREQ:
83+
return chipDb->getChipParam(index.row(),
84+
SpiChipInfo::CHIP_PARAM_FREQ);
8285
case SpiChipDb::CHIP_PARAM_ID1:
8386
chipDb->getHexStringFromParam(chipDb->getChipParam(index.row(),
8487
SpiChipInfo::CHIP_PARAM_ID1), paramStr);
@@ -123,6 +126,7 @@ QVariant SpiChipDbTableModel::headerData(int section,
123126
case SpiChipDb::CHIP_PARAM_STATUS_CMD: return tr("Status com.");
124127
case SpiChipDb::CHIP_PARAM_BUSY_BIT: return tr("Busy bit");
125128
case SpiChipDb::CHIP_PARAM_BUSY_STATE: return tr("Busy bit state");
129+
case SpiChipDb::CHIP_PARAM_FREQ: return tr("Freq. (kHz)");
126130
case SpiChipDb::CHIP_PARAM_ID1: return tr("ID 1");
127131
case SpiChipDb::CHIP_PARAM_ID2: return tr("ID 2");
128132
case SpiChipDb::CHIP_PARAM_ID3: return tr("ID 3");
@@ -159,6 +163,8 @@ QVariant SpiChipDbTableModel::headerData(int section,
159163
return tr("Busy bit number (0-7) in status register");
160164
case SpiChipDb::CHIP_PARAM_BUSY_STATE:
161165
return tr("Busy bit active state (0/1)");
166+
case SpiChipDb::CHIP_PARAM_FREQ:
167+
return tr("Maximum supported SPI frequency in kHz");
162168
case SpiChipDb::CHIP_PARAM_ID1:
163169
return tr("Chip ID 1st byte");
164170
case SpiChipDb::CHIP_PARAM_ID2:
@@ -272,6 +278,14 @@ bool SpiChipDbTableModel::setData(const QModelIndex &index,
272278
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_BUSY_STATE,
273279
paramVal);
274280
return true;
281+
case SpiChipDb::CHIP_PARAM_FREQ:
282+
if (chipDb->getParamFromString(value.toString(), paramVal))
283+
return false;
284+
if (!chipDb->isParamValid(paramVal, 0x00, 0xFFFFFFFF))
285+
return false;
286+
chipDb->setChipParam(index.row(), SpiChipInfo::CHIP_PARAM_FREQ,
287+
paramVal);
288+
return true;
275289
case SpiChipDb::CHIP_PARAM_ID1:
276290
if (chipDb->getParamFromHexString(value.toString(), paramVal))
277291
return false;

qt/spi_chip_info.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ typedef struct __attribute__((__packed__))
1515
uint8_t status_cmd;
1616
uint8_t busy_bit;
1717
uint8_t busy_state;
18+
uint32_t freq;
1819
} Conf;
1920

2021
SpiChipInfo::SpiChipInfo()
@@ -38,6 +39,7 @@ const QByteArray &SpiChipInfo::getHalConf()
3839
conf.status_cmd = static_cast<uint8_t>(params[CHIP_PARAM_STATUS_CMD]);
3940
conf.busy_bit = static_cast<uint8_t>(params[CHIP_PARAM_BUSY_BIT]);
4041
conf.busy_state = static_cast<uint8_t>(params[CHIP_PARAM_BUSY_STATE]);
42+
conf.freq = params[CHIP_PARAM_FREQ];
4143

4244
halConf.clear();
4345
halConf.append(reinterpret_cast<const char *>(&conf), sizeof(conf));

qt/spi_chip_info.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class SpiChipInfo : public ChipInfo
2121
CHIP_PARAM_STATUS_CMD,
2222
CHIP_PARAM_BUSY_BIT,
2323
CHIP_PARAM_BUSY_STATE,
24+
CHIP_PARAM_FREQ,
2425
CHIP_PARAM_ID1,
2526
CHIP_PARAM_ID2,
2627
CHIP_PARAM_ID3,

0 commit comments

Comments
 (0)