pyrohaz - You still haven't mentioned how fast this must go.
It looks like a serial buffer, and not random access. A serial stream of data is much easier than random access.
So, assuming it isn't too fast, and if that description covers the major requirements, then IMHO it isn't worth the complexity of a separate memory chip.
IMHO it would be easier to build and debug using have the Arduino as an SPI master, and a Maple SPI port be a slave.
It sounds straightforward; push data from the Arduino to the Maple. The Maple buffers the data in memory, and later consumes the data from the buffer.
It sounds like there is no need for a "memory address". It sounds like a stream of data.
How big is each item of data?
Access would be asynchronous in the sense that the Maple would 'catch' data from SPI as it arrives using an interrupt or DMA, which would put it into an in-memory buffer on the Maple,
The main program loop on the Maple would retrieve data from the in-memory buffer.
So, as long as the Maple isn't running more slowly than the data is received, then it is SPI to SPI comms.
Exactly the same thing could be done using a UART.
IMHO I2C is more complex than needed, and is an order of magnitude slower.
So the Arduino side would be:
void loop(){
Send(Data);
//Gather data
Data = X;
}
The Maple side would be:
SPI-interrupt() {
read Data from SPI buffer
if buffer is full {
set a flag for the main oop
do the right thing with Data
} else {
put Data into buffer,
update buffer so loop can detect that data is available.
}
}
loop would use a function which gets the next Data item from the buffer.
The details of how to do it very much depends on what you want to do if data arrives too fast, and what you want to do if there is no data ready to be processed.
There is some code in libmaple to handle circular buffers, but it isn't too hard to write. There are probably many implementations on the interwibble.
A circular buffer keeps track of both the start of the saved Data, and the end. This would allow the interrupt routine to detect if the buffer is full, and the main loop to detect if it is empty.
Trying to use a shared memory chip will need a mechanism to communicate where the start and end of data are too, so your pseudo-code is glossing over a potentially hard problem to solve.