ik ben weer een stukje verder,
ik heb op de ext. RAM een LA signaal gemaakt op de SS (slave select) en op de SI (seriel input).
in de TSOP (atmega 16 slave) heb ik een array gemaakt met daarin 1,2,3,..t/m...20
vanuit de hoofd PCB (atmega 2560) geef ik een comando: TSOP send me your data, en de array word naar buiten geschoven.
op de LA zie ik keurig:
- de SS "0" worden
- gevolgd door: 0b00000010 = "write data to memory"
- dan: 3 bytes = adres klopt met de door mij mee gegeven adres = 1000
- dan: 26x 0b11110000 weet even niet zeker waar die vandaan komen
- MAAR DAN: 6x byte met 1, 6x byte met 2, 6x byte met 3 enz.enz.
(die 6x is af en toe 7x.)
omdat de UART v/d slave->master langzamer is, dan de SPI van de atmega 2560->ext.RAM.
lijkt het er op dat de SPI 6 of 7 keer dezelfde byte verstuurt.
maar ik zie niet hoe dit te voorkomen. wellicht met een interrupt ?
of moet je zelf ergens bij houden dat je een byte al verstuurd hebt ?
wat code erbij hoe ik het gedaan heb, de data vanaf de TSOP (slave) word in een interrupt in een variabele gezet: receivedbyte
die ik weer meteen naar buiten schuif richting de ext. RAM.
c code:
ISR(USART0_RX_vect) // receving data from TSOP's
{
receivedbyte = UDR0; // copy the received byte value into the variable "receivedbyte
TSOP_byte_transfer_counter = TSOP_byte_transfer_counter + 1;
}
c code:
if (TSOP_request_byte_counter == 1) // asking from TSOP 1e byte
{
PORTG &= ~(1 << PING5); // make SS ext. RAM pin = 0
RAM_adress = RAM_adress_temp + 0;
SPI_transfer(0b00000010); // write data to memory
address = 1000; // is address in ext. RAM
SPI_transfer((address>>16)); // adress
SPI_transfer((address>>8)); // adress
SPI_transfer((address)); // adress
while (TSOP_byte_transfer_counter < 300) // doing loop until 300 bytes are in. ^^^^^^^^^^^^^^^^^^^^
{
_delay_us(50); // just for testing
SPI_transfer(receivedbyte); // data what you write in the ext. RAM
}
PORTG |= (1 << PING5); // make SS pin ext. RAM = 1
TSOP_byte_transfer_counter = 0; // if 300 bytes are in make variable "0"
TSOP_request_byte_counter = 2; // read the 2e byte from the TSOP
}