CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 1 of 1
  1. #1
    Join Date
    Jun 2017
    Posts
    5

    data stream for read and write

    Hi all,
    I have two functions which are used for transferring data in SPI protocol. The following gives the code

    Code:
    // --- defines ------------------------------------------------------- //
    #define START_OF_PACKET        0x7a
    #define END_OF_PACKET          0x7b
    #define CHANNEL_NUMBER         0x7c
    #define ESCAPE_BYTE            0x7d
    #define IDLE_BYTE              0x4a
    #define READ_COMMAND           0x10  // Non-incrementing address
    #define WRITE_COMMAND          0x00  // Non-incrementing address
    
    
    #define MAX_TRANSACTION_SIZE   128
    #define PACKET_BUFFER_LENGTH   (MAX_TRANSACTION_SIZE * 2 + 20)  /* MAX_TRANSACTION_SIZE * 2 (for special characters) + 4 (EOP/SOP/CHAN/ESC) */
    #define CTRL_BYTES             4
    #define TX_STATUS_PACKET_SIZE  4
    
    #define RX_MSG_LEN_HEADER      4
    #define RX_MSG_LEN_DATA        4
    #define RX_MSG_LEN_TOTAL       (RX_MSG_LEN_HEADER + 2 * RX_MSG_LEN_DATA)  // Provide 4 extra bytes for escaped chars
    
    
    
    
    uint8_t* function_add_escape(uint8_t* buffer, uint8_t byte)
    {
    	switch(byte)
    	{
    		case START_OF_PACKET:
    		case END_OF_PACKET:
    		case CHANNEL_NUMBER:
    		case ESCAPE_BYTE:
    			*buffer++ = ESCAPE_BYTE;
    			*buffer++ = byte ^ 0x20;
    			break;
    
    		default:
    			*buffer++ = byte;
    			break;
    	}
    
    	return buffer;
    }
    
    size_t packet_encode(bool is_read, uint32_t register_address, uint8_t* data_in, uint8_t* data_out, size_t bytes_to_transfer)
    {
    	size_t ret = 0;
    
    	
    	uint8_t* p = data_out;
    
    	// Channel 00
    	*p++ = CHANNEL_NUMBER;
    	*p++ = 0x00;
    
    	// Start of packet
    	*p++ = START_OF_PACKET;
    
    	// Command
    	*p++ = is_read ? READ_COMMAND : WRITE_COMMAND;
    	*p++ = 0x00;
    
    	// Note: Rest of the packet has to be escaped if needed
    
    	// Size
    	*p++ = 0x00;
    	p = function_add_escape(p, bytes_to_transfer);
    
    	// Copy address..
    	p = function_add_escape(p, (uint8_t)(register_address >> 24));
    	p =function_add_escape(p, (uint8_t)(register_address >> 16));
    	p = function_add_escape(p, (uint8_t)(register_address >> 8));
    
    	if (is_read)
    	{
    		*p++ = END_OF_PACKET;		// Signal next byte as last one
    		p = function_add_escape(p, (uint8_t)register_address);
    	}
    	else
    	{
    		// copy address..
    		p = function_add_escape(p, (uint8_t)register_address);
    
    		// copy value...
    		while(--bytes_to_transfer)
    			p =function_add_escape(p, *data_in++);
    
    		// last byte is inserted after eop
    		*p++ = END_OF_PACKET;
    		p = function_add_escape(p, *data_in);
    	}
    
    	ret = p - data_out;
    	return ret;
    }
    I want to know the data streams for
    Read Register Address 0x00000000
    Read Register Address 0x 00000030
    Write Register Address 0x00000040 and data 0x00008032
    Read Register Address 0x0000 0040 and data 0x00008032

    how can I do that?
    Last edited by 2kaud; July 19th, 2017 at 01:15 PM. Reason: Added code tags

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured