Exemple #1
0
UINT8 enc28j60_readOp(UINT8 op, UINT8 address)
{
	UINT8 data;
   
	// assert CS
	ENC28J60_ENABLE();
	
	// issue read command
	SPDR = op | (address & ADDR_MASK);
	wait_spi();
	// read data
	SPDR = 0x00;
	wait_spi();
	// do dummy read if needed
	if(address & 0x80)
	{
		SPDR = 0x00;
		wait_spi();
	}
	data = SPDR;
	
	// release CS
	ENC28J60_DISABLE();
	
	return data;
}
void writeMCP(char address, char data) {
    select_mcp();
    SPDR = MCP_WRITE;
    wait_spi();
    SPDR = address;
    wait_spi();
    SPDR = data;
    wait_spi();
    deselect_mcp();
}
uint8_t readStatus() {
    uint8_t r;
    select_mcp();
    SPDR = MCP_READ_STATUS;
    wait_spi();
    SPDR = MCP_DUMMY;
    wait_spi();
    r = SPDR;
    deselect_mcp();
    return r;
}
void bitModifyMCP(char address, char mask, char data) {
    select_mcp();
    SPDR = MCP_BITMOD;
    wait_spi();
    SPDR = address;
    wait_spi();
    SPDR = mask;
    wait_spi();
    SPDR = data;
    wait_spi();
    deselect_mcp();
}
uint8_t readMCP(char address) {
    uint8_t r;
    select_mcp();
    SPDR = MCP_READ;
    wait_spi();
    SPDR = address;
    wait_spi();
    SPDR = MCP_DUMMY;
    wait_spi();
    r = SPDR;
    deselect_mcp();
    return r;
}
Exemple #6
0
void en28j60_writeOp(UINT8 op, UINT8 address, UINT8 data)
{
	// assert CS
	ENC28J60_ENABLE();

	// issue write command
	SPDR = op | (address & ADDR_MASK);
	wait_spi();
	// write data
	SPDR = data;
	wait_spi();

	// release CS
	ENC28J60_DISABLE();
}
Exemple #7
0
void enc28j60_writeBuffer(UINT16 len, UINT8* data)
{
	// assert CS
	ENC28J60_ENABLE();
	
	// issue write command
	SPDR = ENC28J60_WRITE_BUF_MEM;
	wait_spi();
	while(len--)
	{
		// write data
		SPDR = *data++;
		wait_spi();
	}	
	// release CS
	ENC28J60_DISABLE();
}
void resetMCP() {
    select_mcp();
    SPDR = MCP_RESET;
    wait_spi();
    deselect_mcp();
    _delay_ms(10);
    //Resets the SPI-CAN controller and waits for it to be ready
}
Exemple #9
0
void enc28j60_readBuffer(UINT16 len, UINT8* data)
{
	// assert CS
	ENC28J60_ENABLE();
	
	// issue read command
	SPDR = ENC28J60_READ_BUF_MEM;
	wait_spi();
	while(len--)
	{
		// read data
		SPDR = 0x00;
		wait_spi();
		*data++ = SPDR;
	}	
	// release CS
	ENC28J60_DISABLE();
}
void requestToSendMCP(char buffer) {
    select_mcp();
    switch(buffer) {
    case 0:
        SPDR = MCP_RTS_TX0;
        break;
    case 1:
        SPDR = MCP_RTS_TX1;
        break;
    case 2:
        SPDR = MCP_RTS_TX2;
        break;
    }
    wait_spi();
    deselect_mcp();
}
struct canMessage readRxBufferMCP(char buffer) {
    //Adresses are relative to Buffer 0
    struct canMessage m;

    select_mcp();

    if ( buffer == 0) SPDR = MCP_READ_RX0;
    else SPDR = MCP_READ_RX1;
    wait_spi();

    SPDR = MCP_DUMMY;
    wait_spi();

    m.id = SPDR<<3; //8 high bits recived and shifted to fit the 11bit format (0x61)

    SPDR = MCP_DUMMY;
    wait_spi();    //Recive lower 3 bits of id

    m.id |= (SPDR & 0xE0)>>5;  //Id is received, cleansed and constructed  (0x62)

    SPDR = MCP_DUMMY;
    wait_spi();    //Dummy to read (0x63)

    SPDR = MCP_DUMMY;
    wait_spi();    //Dummy to read (0x64)

    SPDR = MCP_DUMMY;
    wait_spi();    //Reads DLC (size) (0x65)

    m.size = SPDR & 0x0F;

    //Reading data
    uint8_t c;
    for(c = 0; c < m.size; c++) {
        SPDR = MCP_DUMMY;
        wait_spi();    //Reads data (0x66..0x6D)
        m.data[c] = SPDR;
    }

    deselect_mcp();

    return m;
}
void fillTxBufferMCP(char buffer, struct canMessage m) {
    //Adresses are relative to Buffer 0
    select_mcp();
    if ( buffer == 0) SPDR = MCP_LOAD_TX0;
    if ( buffer == 1) SPDR = MCP_LOAD_TX1;
    else SPDR = MCP_LOAD_TX2;
    wait_spi();

    uint8_t t;

    t = m.id >> 3;

    SPDR = t;
    wait_spi();  //sends higher 8 bits of ID to 0x31

    t = (m.id << 5) & 0xE0;

    SPDR = t;
    wait_spi(); //sends lower 3 bits to higher bits of 0x32

    SPDR = MCP_DUMMY;
    wait_spi();    //Dummy to fill (0x33)

    SPDR = MCP_DUMMY;
    wait_spi();    //Dummy to fill(0x34)


    SPDR = m.size & 0x0F;
    wait_spi();    //Sets 0 at the RTR and the proper size at 0x35

    //Reading data
    uint8_t c;
    for(c = 0; c < m.size; c++) {
        SPDR = m.data[c];
        wait_spi();    //fills in data (0x36..0x40)
    }

    deselect_mcp();
}