-
July 19th, 2017, 04:26 AM
#1
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
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|