Skip to content

Commit f7198ca

Browse files
committed
hosted: SPI: add realistic delays
1 parent c43328c commit f7198ca

2 files changed

Lines changed: 24 additions & 0 deletions

File tree

hosted/SPI.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ const uint8_t SPI_MODE3 = 0x11; ///< CPOL: 1 CPHA: 1
1212

1313
class SPIClass {
1414
public:
15+
SPIClass() {
16+
SPI1CLK = 38;
17+
}
1518
void begin() {
1619
}
1720
void write(uint8_t data);
1821
void setFrequency(uint32_t freq) {
22+
SPI1CLK = freq / 1000000;
1923
}
2024
bool pins(int8_t sck, int8_t miso, int8_t mosi, int8_t ss) {
2125
return true;

hosted/hosted_spi.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,50 @@
66
uint8_t vs23_mem[131072];
77
struct vs23_int vs23_int;
88

9+
static void wait_bytes(int c) {
10+
delayMicroseconds((c)*8/SPI1CLK);
11+
}
12+
913
void SpiRamReadBytesFast(uint32_t address, uint8_t *data, uint32_t count) {
1014
//printf("RRBF %08X %p %d\n", address, data, count);
1115
for (int i = 0; i < count; ++i)
1216
data[i] = vs23_mem[(address+i) % 131072];
17+
wait_bytes(count+4);
1318
}
1419
void SpiRamReadBytes(uint32_t address, uint8_t *data, uint32_t count) {
1520
//printf("RRBS %08X %p %d\n", address, data, count);
1621
for (int i = 0; i < count; ++i)
1722
data[i] = vs23_mem[(address+i) % 131072];
23+
wait_bytes(count+4);
1824
}
1925
uint16_t SpiRamReadByte(uint32_t address) {
2026
printf("RRB %08X\n", address);
27+
wait_bytes(5);
2128
return vs23_mem[address % 131072];
2229
}
2330

2431
void SpiRamWriteBytesFast(uint32_t address, uint8_t *data, uint32_t len) {
2532
//printf("RWBF %08X %p %d\n", address, data, len);
2633
for (int i = 0; i < len; ++i)
2734
vs23_mem[(address+i) % 131072] = data[i];
35+
wait_bytes(len+4);
2836
}
2937
void SpiRamWriteWord(uint16_t waddress, uint16_t data) {
3038
//printf("RWW %08X %04X\n", waddress, data);
3139
vs23_mem[(waddress * 2) % 131072] = data >> 8;
3240
vs23_mem[(waddress * 2 + 1) % 131072] = data;
41+
wait_bytes(6);
3342
}
3443
void SpiRamWriteByte(register uint32_t address, uint8_t data) {
3544
//printf("RWB %08X %02X\n", address, data);
3645
vs23_mem[address % 131072] = data;
46+
wait_bytes(5);
3747
}
3848
void SpiRamWriteBytes(uint32_t address, uint8_t * data, uint32_t len) {
3949
//printf("RWBS %08X %p %d\n", address, data, len);
4050
for (int i = 0; i < len; ++i)
4151
vs23_mem[(address+i) % 131072] = data[i];
52+
wait_bytes(len+4);
4253
}
4354

4455
uint32_t mvsrc, mvtgt;
@@ -51,17 +62,20 @@ void SpiRamWriteBM2Ctrl(uint16_t data1, uint16_t data2, uint16_t data3) {
5162
mvskp = data1;
5263
mvlen = data2;
5364
mvlin = data3;
65+
wait_bytes(5);
5466
}
5567
void SpiRamWriteBMCtrl(uint16_t opcode, uint16_t data1, uint16_t data2, uint16_t data3) {
5668
//printf("RWBMC %04X %04X %04X %04X\n", opcode, data1, data2, data3);
5769
mvsrc = (data1 << 1) | ((data3 >> 2) & 1);
5870
mvtgt = (data2 << 1) | ((data3 >> 1) & 1);
5971
mvdir = data3 & 1 ? -1 : 1;
72+
wait_bytes(6);
6073
}
6174
void SpiRamWriteBMCtrlFast(uint16_t opcode, uint16_t data1, uint16_t data2) {
6275
printf("RWBMCF %04X %04X %04X\n", opcode, data1, data2);
6376
mvsrc = (mvsrc & 1) | (data1 << 1);
6477
mvtgt = (mvtgt & 1) | (data2 << 1);
78+
wait_bytes(5);
6579
}
6680

6781
void MoveBlockAddr(uint32_t byteaddress2, uint32_t dest_addr) {
@@ -72,6 +86,7 @@ void MoveBlockAddr(uint32_t byteaddress2, uint32_t dest_addr) {
7286
}
7387

7488
uint16_t SpiRamReadRegister(register uint16_t opcode) {
89+
wait_bytes(3);
7590
switch (opcode) {
7691
case CURLINE:
7792
return int(micros() / vs23_int.line_us) % vs23_int.line_count;
@@ -83,10 +98,12 @@ uint16_t SpiRamReadRegister(register uint16_t opcode) {
8398

8499
uint8_t SpiRamReadRegister8(uint16_t opcode) {
85100
printf("RRR8 %04X\n", opcode);
101+
wait_bytes(2);
86102
return 0xff;
87103
}
88104

89105
void SpiRamWriteRegister(uint16_t opcode, uint16_t data) {
106+
wait_bytes(3);
90107
switch (opcode) {
91108
case VDCTRL1:
92109
vs23_int.vdctrl1 = data;
@@ -110,14 +127,17 @@ void SpiRamWriteRegister(uint16_t opcode, uint16_t data) {
110127
}
111128
}
112129
void SpiRamWriteByteRegister(uint16_t opcode, uint16_t data) {
130+
wait_bytes(2);
113131
printf("RWBR %04X %04X\n", opcode, data);
114132
}
115133

116134
void SpiRamWriteProgram(uint16_t opcode, uint16_t data1, uint16_t data2) {
135+
wait_bytes(5);
117136
printf("RWP %04X %04X %04X\n", opcode, data1, data2);
118137
}
119138

120139
void SPIClass::write(uint8_t data) {
140+
wait_bytes(1);
121141
if (data == 0x36) {
122142
//printf("mov src %05X tgt %05X dir %d lin %d len %d skp %d\n",
123143
// mvsrc, mvtgt, mvdir, mvlin, mvlen, mvskp);

0 commit comments

Comments
 (0)