Skip to content

Commit 0fb97d7

Browse files
committed
Add support for 24LC256 memory
Now I have two memories with the same i2c address, so I couldn't identify them by their address anymore. The easiest way to solve this was to just introduce the name of the memory each time by hand in the cli, and then verify in the uC that the corresponding i2c device is alive.
1 parent bbc3bff commit 0fb97d7

File tree

14 files changed

+148
-148
lines changed

14 files changed

+148
-148
lines changed

eeprom_programmer_PC/eeprom-programmer.pro.user

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE QtCreatorProject>
3-
<!-- Written by QtCreator 6.0.2, 2022-03-23T00:50:34. -->
3+
<!-- Written by QtCreator 6.0.2, 2022-03-24T00:36:43. -->
44
<qtcreator>
55
<data>
66
<variable>EnvironmentId</variable>

eeprom_programmer_PC/src/app.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class App: public MemoryComm
2828
ST_DISCONNECTED,
2929
ST_INIT,
3030
ST_IDLE,
31+
ST_MEMID,
3132
ST_PING,
3233
ST_WAIT_READMEM,
3334
ST_WAIT_WRITEMEM
@@ -64,6 +65,7 @@ private slots:
6465
QString m_filename_out = "mem_out.bin";
6566
void setSignals();
6667
bool doSomething();
68+
void retryConnection();
6769
};
6870

6971
// m_ = member

eeprom_programmer_PC/src/app_.cpp

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ bool App::doSomething()
7676
if(!App::writeMem()) {
7777
m_currentOperation = OP_NONE;
7878
m_xferState = ST_IDLE;
79+
QCoreApplication::exit(1);
7980
}
8081
break;
8182

@@ -100,6 +101,14 @@ bool App::doSomething()
100101
return m_currentOperation != OP_NONE;
101102
}
102103

104+
void App::retryConnection()
105+
{
106+
clearBuffers();
107+
m_xferState = ST_DISCONNECTED;
108+
m_connected = false;
109+
QTimer::singleShot(1000, this, &App::reconnect);
110+
}
111+
103112
void App::handleXfer(pkgdata_t *pkg) {
104113
// TODO: handle error packages
105114

@@ -119,13 +128,26 @@ void App::handleXfer(pkgdata_t *pkg) {
119128
if(pkg->cmd == CMD_INIT) {
120129
m_standardOutput << "Connected to uC." << Qt::endl;
121130
m_connected = true;
131+
m_xferState = ST_MEMID;
132+
sendCommand_memid();
133+
}
134+
else {
135+
m_standardOutput << "Could not connect to uC" << Qt::endl;
136+
retryConnection();
137+
}
138+
break;
139+
140+
case ST_MEMID:
141+
if(!pkg)
142+
break;
143+
144+
if(pkg->cmd == CMD_OK) {
122145
m_xferState = ST_IDLE;
123146
doSomething();
124147
}
125148
else {
126-
m_standardOutput << "Could not connect to uC" << Qt::endl;
127-
clearBuffers();
128-
m_xferState = ST_DISCONNECTED;
149+
printError(pkg);
150+
QCoreApplication::exit(1);
129151
}
130152
break;
131153

@@ -144,8 +166,7 @@ void App::handleXfer(pkgdata_t *pkg) {
144166
}
145167
else {
146168
m_standardOutput << "Connection error" << Qt::endl;
147-
m_connected = false;
148-
m_xferState = ST_DISCONNECTED;
169+
retryConnection();
149170
}
150171
break;
151172

@@ -154,36 +175,40 @@ void App::handleXfer(pkgdata_t *pkg) {
154175
if(!pkg)
155176
break;
156177

178+
m_currentOperation = OP_NONE;
157179
if(pkg->cmd == CMD_MEMDATA) {
158180
// finished receiving memory data
159181
m_memBuffer = pkg->data;
160182
printData();
161183
saveData();
162-
m_currentOperation = OP_NONE;
184+
m_xferState = ST_IDLE;
185+
QTimer::singleShot(50, qApp, SLOT(quit()));
163186
}
164187
else {
165188
printError(pkg);
189+
setNextOperation(OP_RX);
190+
doSomething();
166191
}
167-
clearBuffers();
168-
m_xferState = ST_IDLE;
169-
QTimer::singleShot(50, qApp, SLOT(quit()));
192+
// clearBuffers();
170193
break;
171194

172195
case ST_WAIT_WRITEMEM: // requested eeprom full write - waiting confirmation
173196

174197
if(!pkg)
175198
break;
176199

200+
m_currentOperation = OP_NONE;
177201
if(pkg->cmd == CMD_TXRX_DONE) {
178202
m_standardOutput << "Memory write SUCCESSFULLY" << Qt::endl;
179-
m_currentOperation = OP_NONE;
203+
m_xferState = ST_IDLE;
204+
QTimer::singleShot(50, qApp, SLOT(quit()));
180205
}
181206
else {
182207
printError(pkg);
208+
setNextOperation(OP_TX);
209+
doSomething();
183210
}
184-
clearBuffers();
185-
m_xferState = ST_IDLE;
186-
QTimer::singleShot(50, qApp, SLOT(quit()));
211+
// clearBuffers();
187212
break;
188213

189214
default:

eeprom_programmer_PC/src/memorycomm.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ bool MemoryComm::writeMem(const QByteArray& memBuffer) {
123123
m_memindex = 0;
124124
m_memBuffer = memBuffer; // CHECK HOW THIS WORKS
125125

126+
m_buffer.clear();
126127
m_serialPortReader.clearBuffer();
127128
m_serialPort.clear(QSerialPort::Input);
128129

@@ -136,6 +137,11 @@ bool MemoryComm::sendMemoryBlock() {
136137
return sendCommand(CMD_MEMDATA, m_memBuffer.mid(memidx, PKG_DATA_MAX));
137138
}
138139

140+
bool MemoryComm::sendCommand_memid() {
141+
return sendCommand(CMD_MEMID, m_memtype);
142+
}
143+
144+
139145
bool MemoryComm::sendCommand_ping(void) {
140146
return sendCommand(CMD_PING);
141147
}

eeprom_programmer_PC/src/memorycomm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class MemoryComm : public QCoreApplication, public EEPROM
5454
bool writeMem(const QByteArray& memBuffer);
5555
bool readMem(void);
5656
bool sendCommand_ping(void);
57+
bool sendCommand_memid(void);
5758
bool sendCommand(commands_e cmd);
5859
bool sendCommand(commands_e cmd, uint8_t data);
5960
bool sendCommand(commands_e cmd, const QByteArray& data);

eeprom_programmer_STM32/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
Debug
2+
/Release/

eeprom_programmer_STM32/.settings/language.settings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
77
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
88
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
9-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1155191438658769878" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
9+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1833027373205504229" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
1010
<language-scope id="org.eclipse.cdt.core.gcc"/>
1111
<language-scope id="org.eclipse.cdt.core.g++"/>
1212
</provider>
@@ -18,7 +18,7 @@
1818
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
1919
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
2020
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
21-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1155191438658769878" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
21+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1833027373205504229" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
2222
<language-scope id="org.eclipse.cdt.core.gcc"/>
2323
<language-scope id="org.eclipse.cdt.core.g++"/>
2424
</provider>

eeprom_programmer_STM32/Core/Inc/main.h

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ enum memtype_e {
5353
// 24LC256 NOT SUPPORTED!!!
5454
typedef enum memtype_e memtype_t;
5555

56-
extern uint32_t g_memsize;
56+
extern uint16_t g_memsize;
5757
extern enum memtype_e g_memtype;
58-
//extern uint8_t membuffer[];
5958
extern uint8_t g_buffer[];
6059

6160
extern I2C_HandleTypeDef hi2c2;
@@ -148,19 +147,15 @@ void Error_Handler(void);
148147

149148
/* USER CODE BEGIN EFP */
150149

150+
151+
HAL_StatusTypeDef EEPROM_InitMemory(enum memtype_e dev_id);
152+
uint16_t EEPROM_getMemSize(enum memtype_e memtype);
151153
int EEPROM_write(memtype_t device, const uint8_t *buffer, uint16_t register_base, uint16_t size);
152-
int EEPROM_write_page(memtype_t device, const uint8_t *pagebuffer, uint16_t register_address);
153-
int EEPROM_write_reg(memtype_t device, uint8_t reg, uint16_t register_address);
154+
int EEPROM_writePage(memtype_t device, const uint8_t *pagebuffer, uint16_t register_address);
155+
int EEPROM_writeReg(memtype_t device, uint8_t reg, uint16_t register_address);
154156
int EEPROM_read(memtype_t device, uint8_t *buffer, uint16_t register_base, uint16_t size);
155-
int EEPROM_read_page(memtype_t device, uint8_t *pagebuffer, uint16_t register_address);
156-
int EEPROM_read_reg(memtype_t device, uint8_t *reg, uint16_t register_address);
157-
158-
int MEMX24645_write_page(const uint8_t *page, uint16_t register_address);
159-
int MEMX24645_write(const uint8_t *buffer, uint16_t register_base, uint16_t size);
160-
int MEMX24645_write_reg(uint8_t reg, uint16_t register_address);
161-
int MEMX24645_read_reg(uint8_t *reg, uint16_t register_address);
162-
int MEMX24645_read_page(uint8_t *page, uint16_t register_address);
163-
int MEMX24645_read(uint8_t *buf, uint16_t register_base, uint16_t size);
157+
int EEPROM_readPage(memtype_t device, uint8_t *pagebuffer, uint16_t register_address);
158+
int EEPROM_readReg(memtype_t device, uint8_t *reg, uint16_t register_address);
164159

165160
int serial_write(const uint8_t *data, uint16_t len);
166161
int serial_writebyte(uint8_t byte);
@@ -195,8 +190,6 @@ HAL_StatusTypeDef sendPackage(uint8_t cmd, uint8_t *data, uint16_t len);
195190
HAL_StatusTypeDef receivePackage(package_t *pkg);
196191
HAL_StatusTypeDef try_receive(package_t *pkg);
197192

198-
uint32_t getMemSize(enum memtype_e memtype);
199-
200193
/* USER CODE END EFP */
201194

202195
/* Private defines -----------------------------------------------------------*/

eeprom_programmer_STM32/Core/Src/AP_application.c

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,30 @@
2323
/*
2424
* Electrical connections:
2525
*
26-
* I2C2:
27-
* SCL: PB10
28-
* SDA: PB11
26+
* uC I2C2:
27+
* PB10: SCL
28+
* PB11: SDA
2929
*
3030
* EEPROM (DIP-8):
31-
* 1: GND
32-
* 2: GND
33-
* 3: VCC
34-
* 4: GND
35-
* 5: SDA
36-
* 6: SCL
37-
* 7: GND
38-
* 8: VCC
31+
* 1. A0: GND
32+
* 2. A1: GND
33+
* 3. A2: VCC
34+
* 4. Vss: GND
35+
* 5. SDA: SDA
36+
* 6. SCL: SCL
37+
* 7. WP: GND
38+
* 8. Vcc: Vcc
3939
*
40-
* Add a 10kohm pullup resistor on SCL and SDA
40+
* Add a pullup resistor on SCL and SDA.
41+
* For 100kHz as used here, 10kOhm should do.
42+
* If changed to 400kHz or 1MHz, use a 2kOhm resistor (or similar)
4143
*/
4244

4345
#define SEND(x) do {if((x) != HAL_OK) return HAL_ERROR;} while(0)
4446
#define RECV(x) do {if((x) != HAL_OK) return HAL_ERROR;} while(0)
4547

4648
static int cmdHasData(uint8_t command);
4749

48-
enum memtype_e g_memtype = MEMTYPE_NONE;
49-
uint32_t g_memsize = 0UL;
5050
uint8_t g_buffer[PKG_DATA_MAX];
5151

5252

@@ -152,7 +152,6 @@ int cmdHasData(command_t command) {
152152
return 0;
153153
}
154154

155-
156155
static errorcode_t sendMemoryBlock(uint8_t cmd, uint16_t offset)
157156
{
158157
// package_t pkg;
@@ -215,11 +214,11 @@ void uart_fsm(void)
215214
static uint16_t mem_idx = 0;
216215
HAL_StatusTypeDef ret;
217216

218-
if(HAL_GetTick() > timeout) {
219-
if(st != 0) {
217+
if(st != 0 && HAL_GetTick() > timeout) {
218+
220219
sendErr(ERROR_TIMEOUT);
221220
st = 0;
222-
}
221+
223222
}
224223

225224
switch (st)
@@ -233,12 +232,28 @@ void uart_fsm(void)
233232
if(package.cmd == CMD_INIT) {
234233
sendCommand(CMD_INIT);
235234
led_on();
236-
st++;
235+
st = CMD_MEMID;
237236
timeout = HAL_GetTick()+TIMEOUT_MS;
238237
}
239238
}
240239
break;
241240

241+
case CMD_MEMID:
242+
ret = receivePackage(&package);
243+
if(ret == HAL_OK && package.cmd == CMD_MEMID)
244+
{
245+
enum memtype_e memid = package.data[0];
246+
if(EEPROM_InitMemory(memid) == HAL_OK) {
247+
sendCommand(CMD_OK);
248+
st = 1;
249+
}
250+
else {
251+
sendErr(ERROR_MEMID);
252+
st = 0;
253+
}
254+
}
255+
break;
256+
242257
case 1: /* waiting to receive a package */
243258
ret = receivePackage(&package);
244259
if(ret != HAL_OK)
@@ -378,11 +393,6 @@ void uart_fsm(void)
378393
st = 1;
379394
break;
380395

381-
case CMD_MEMID:
382-
sendCommandWithData(CMD_DATA, g_memtype);
383-
st = 1;
384-
break;
385-
386396
case CMD_DISCONNECT:
387397
st = 0;
388398
break;

0 commit comments

Comments
 (0)