?? spi.ini
字號:
define char spi_at250x0_state
define int spi_at250x0_address
define char spi_at250x0_status
map 0x700000,0x70FFFF READ WRITE
func char spi_at250x0 (char st) {
unsigned char opcode;
printf ("AT250X0: STATE %u\n", (unsigned) st);
switch (st) {
case 0: /* Get OPCode */
opcode = SPI0_OUT & 0x0007;
printf ("AT250X0: OPCODE %u\n", (unsigned) opcode);
switch (opcode)
{
case 1: /* WRSR */
return (0);
case 2: /* Write */
printf ("AT250X0: WRITE OPCODE Detected\n");
spi_at250x0_address = (SPI0_OUT & 0x08) << 5;
return (3);
case 3: /* Read */
printf ("AT250X0: READ OPCODE Detected\n");
spi_at250x0_address = (SPI0_OUT & 0x08) << 5;
return (1);
case 4: /* WRDI */
spi_at250x0_status &= ~0x02; /* Clear Write Enable Bit */
return (0);
case 5: /* RDSR */
SPI0_IN = spi_at250x0_status;
return (5);
case 6: /* WREN */
spi_at250x0_status |= 0x02; /* Set Write Enable Bit */
return (0);
}
return (0);
case 1: /* Get Address LSB for READ */
spi_at250x0_address |= (SPI0_OUT & 0xFF);
printf ("AT250X0: Address %4.4X Detected\n", spi_at250x0_address);
return (2);
case 2: /* Read */
printf ("AT250X0: Read %2.2X from address %4.4X\n", 'A', spi_at250x0_address);
SPI0_IN = _rbyte(0x700000 + spi_at250x0_address);
spi_at250x0_address = (spi_at250x0_address + 1) % 512;
return (2);
case 3: /* Get Address LSB for WRITE */
spi_at250x0_address |= (SPI0_OUT & 0xFF);
printf ("AT250X0: Address %4.4X Detected\n", spi_at250x0_address);
return (4);
case 4: /* Write */
if (spi_at250x0_status & 0x02)
{
printf ("AT250X0: Write %2.2X to address %4.4X\n", SPI0_OUT, spi_at250x0_address);
_wbyte(0x700000 + spi_at250x0_address, SPI0_OUT);
spi_at250x0_status |= 0x01;
}
return (5);
case 5: /* Instruction End */
return (5);
}
return (0);
}
/*
* This signal function watches the AT89S8252 SPI port for writes. If there
* is an SPI port output and if P1.0 is LO (AT250X0 chip select) then interpret
* the SPI output data and run the state machine.
*/
signal void spi_watcher (void) {
PORT0 |= 0x00000080;
spi_at250x0_state = 0;
while (1) {
wwatch (SPI0_OUT);
printf ("SPI0_OUT Detected\n");
if ((PORT0 & 0x00000400) == 0) //chipselect
{
printf ("Calling AT250X0 Routines\n");
spi_at250x0_state = spi_at250x0 (spi_at250x0_state);
if (spi_at250x0_status & 0x01)
swatch (0.000100);
spi_at250x0_status &= ~0x01;
}
else
{
printf ("Resetting AT250X0 Routines\n");
spi_at250x0_state = 0;
}
}
}
/*-----------------------------------------------
Enable the signal function for SPI writes.
-----------------------------------------------*/
spi_watcher ();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -