AM243x Motor Control SDK  09.02.00
bissc_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 #ifndef BISSC_DRV_H_
35 #define BISSC_DRV_H_
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #include <stdio.h>
42 #include <string.h>
43 #include <math.h>
44 #include <drivers/pruicss.h>
46 /* Single PRU - Single channel configuration */
47 #define BISSC_MODE_SINGLE_CHANNEL_SINGLE_PRU (0U)
48 /* Single PRU - Multichannel configuration */
49 #define BISSC_MODE_MULTI_CHANNEL_SINGLE_PRU (1U)
50 /* Multichannel - Load Share configuration */
51 #define BISSC_MODE_MULTI_CHANNEL_MULTI_PRU (2U)
52 
53 /* Minimum and Maximum BiSSC cycle time depends on various params as below:
54  TCycle_min = TMA ∗ (5 + DLEN + CRCLEN) + tLineDelay + tbusy_max + busy_s_max + tTO
55  Instead wait for max of 5 ms as this can vary for different encoders and for daisy chain
56 */
57 #define BISSC_MAX_CYCLE_TIMEOUT 5
58 /* Maximum number of Endat Channels*/
59 #define NUM_ED_CH_MAX 3
60 /* Maximum number of BiSS-C Encoders connected in Daisy chain*/
61 #define NUM_ENCODERS_MAX 3
62 /* Max processing delay as per spec - values are in valid bits/clock cycles*/
63 #define BISSC_MAX_PROC_DELAY_1MHZ 40
64 #define BISSC_MAX_PROC_DELAY_2MHZ 80
65 #define BISSC_MAX_PROC_DELAY_5MHZ 200
66 #define BISSC_MAX_PROC_DELAY_8MHZ 320
67 #define BISSC_MAX_PROC_DELAY_10MHZ 400
68 #define BISSC_CTS_BIT 1 /* CTS bit for control communication */
69 #define BISSC_ENC_ID_LEN 3 /* Number of Encoder ID bits */
70 #define BISSC_ENC_ID_MASK 0x7 /* Mask for encoder ID*/
71 #define BISSC_REG_ADDR_LEN 7 /* Number of bits for Register address */
72 #define BISSC_REG_ADDR_MASK 0x7F /* Mask for Register address */
73 #define BISSC_RWS_LEN 3 /* Number of RWS bits */
74 #define BISSC_RWS_MASK 0x7 /* Mask for RWS bits */
75 #define BISSC_CTRL_READ_ACCESS 0x5 /* RWS = "101" for read access of register */
76 #define BISSC_CTRL_WRITE_ACCESS 0x3 /* RWS = "011" for write access of register */
77 #define BISSC_REG_DATA_LEN 8 /* Number of Register data bits */
78 #define BISSC_REG_DATA_MASK 0xFF /* Mask for Register data */
79 #define BISSC_CTRL_STOP_LEN 2 /* Number of stop bits PS, P: stop bit for one frame, S: stop bit for sequential control communication */
80 #define BISSC_RX_SAMPLE_SIZE 7 /* 8x over clock */
81 #define BISSC_RX_SAMPLE_SIZE_10MHZ 3 /* 4x over clock */
82 #define BISSC_POS_CRC_LEN 6 /* Number of position data CRC bits */
83 #define BISSC_EW_LEN 2 /* Number of Error and Warning bits */
84 #define BISSC_CTRL_CMD_CRC_LEN 4 /* Number of CTRL cmd CRC bits */
85 #define BISSC_CTRL_CMD_CRC_MASK 0xF /* Mask for CTRL cmd CRC bits */
86 #define BISSC_POS_DATA_LEN_DEFAULT 12 /* Default data length instead of garbage*/
87 #define BISSC_SAFETY_CRC_LEN 16 /* Number of Safety CRC bits */
88 #define BISSC_RX_ENABLE_FRACTIONAL_DIV (1<<15) /* Enable fractional divider 1.5 for RX */
89 /* Allowed frequencies in MHz for BiSSC */
90 #define BISSC_FREQ_1MHZ 1
91 #define BISSC_FREQ_2MHZ 2
92 #define BISSC_FREQ_5MHZ 5
93 #define BISSC_FREQ_8MHZ 8
94 #define BISSC_FREQ_10MHZ 10
95 
103 {
104  uint16_t rx_div;
106  uint16_t tx_div;
108  uint16_t rx_div_attr;
110  uint16_t is_core_clk;
112 };
119 {
132 };
140 {
141  uint8_t cmd_result;
143  uint8_t cmd_rcv_crc;
145  uint8_t cmd_otf_crc;
147 };
155 {
156  int32_t pruicss_slicex;
158  int32_t load_share;
180  void *pruicss_cfg;
182  int64_t raw_data;
202  int32_t totalchannels;
206  uint32_t baud_rate;
208  uint32_t core_clk_freq;
210  uint32_t uart_clk_freq;
212  void *pruicss_iep;
214  int64_t cmp3;
216 };
217 
218 #ifdef __cplusplus
219 }
220 #endif
221 
222 #endif
bissc_priv::pruicss_slicex
int32_t pruicss_slicex
Definition: bissc_drv.h:156
bissc_priv::load_share
int32_t load_share
Definition: bissc_drv.h:158
bissc_priv::ctrl_reg_address
uint32_t ctrl_reg_address[NUM_ED_CH_MAX]
Definition: bissc_drv.h:196
bissc_priv::baud_rate
uint32_t baud_rate
Definition: bissc_drv.h:206
bissc_interface.h
NUM_ED_CH_MAX
#define NUM_ED_CH_MAX
Definition: bissc_drv.h:59
bissc_priv::ctrl_reg_data
uint32_t ctrl_reg_data[NUM_ED_CH_MAX]
Definition: bissc_drv.h:198
bissc_priv::proc_delay
uint16_t proc_delay[NUM_ED_CH_MAX]
Definition: bissc_drv.h:204
bissc_position_info::ew
uint8_t ew[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:126
bissc_priv::totalchannels
int32_t totalchannels
Definition: bissc_drv.h:202
bissc_priv
Initialize BiSS-C firmware interface address and get the pointer to struct bissc_priv instance.
Definition: bissc_drv.h:155
NUM_ENCODERS_MAX
#define NUM_ENCODERS_MAX
Definition: bissc_drv.h:61
bissc_pruicss_xchg
Structure defining BiSSC interface.
Definition: bissc_interface.h:109
bissc_priv::is_continuous_mode
int32_t is_continuous_mode
Definition: bissc_drv.h:178
bissc_priv::calc_safety_crc
int32_t calc_safety_crc[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:176
bissc_control_info::cmd_rcv_crc
uint8_t cmd_rcv_crc
Definition: bissc_drv.h:143
bissc_priv::ctrl_write_status
int8_t ctrl_write_status[NUM_ED_CH_MAX]
Definition: bissc_drv.h:194
bissc_priv::sign_of_life_cnt
int32_t sign_of_life_cnt[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:172
bissc_clk_cfg::tx_div
uint16_t tx_div
Definition: bissc_drv.h:106
bissc_priv::data_len
int32_t data_len[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:160
bissc_control_info
Structure defining BiSSC Channel specific control communication(ctrl) results.
Definition: bissc_drv.h:140
bissc_position_info::angle
float angle[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:122
bissc_priv::rcv_safety_crc
int32_t rcv_safety_crc[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:174
bissc_priv::pruicss_xchg
struct bissc_pruicss_xchg * pruicss_xchg
Definition: bissc_drv.h:168
bissc_priv::num_encoders
int32_t num_encoders[NUM_ED_CH_MAX]
Definition: bissc_drv.h:192
bissc_clk_cfg::is_core_clk
uint16_t is_core_clk
Definition: bissc_drv.h:110
bissc_priv::pd_crc_err_cnt
int32_t pd_crc_err_cnt[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:188
bissc_priv::channel
int32_t channel[NUM_ED_CH_MAX]
Definition: bissc_drv.h:166
bissc_clk_cfg::rx_div_attr
uint16_t rx_div_attr
Definition: bissc_drv.h:108
bissc_priv::raw_data
int64_t raw_data
Definition: bissc_drv.h:182
bissc_position_info::otf_crc
uint8_t otf_crc[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:130
bissc_priv::cmp3
int64_t cmp3
Definition: bissc_drv.h:214
bissc_priv::pruicss_iep
void * pruicss_iep
Definition: bissc_drv.h:212
bissc_priv::enc_pos_data
struct bissc_position_info enc_pos_data[NUM_ED_CH_MAX]
Definition: bissc_drv.h:184
bissc_position_info
Structure defining BiSSC Position data results.
Definition: bissc_drv.h:119
bissc_priv::pruicss_cfg
void * pruicss_cfg
Definition: bissc_drv.h:180
bissc_position_info::num_of_turns
uint32_t num_of_turns[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:124
bissc_priv::ctrl_crc_err_cnt
int32_t ctrl_crc_err_cnt[NUM_ED_CH_MAX]
Definition: bissc_drv.h:190
bissc_priv::ctrl_enc_id
uint32_t ctrl_enc_id[NUM_ED_CH_MAX]
Definition: bissc_drv.h:200
bissc_priv::has_safety
int32_t has_safety[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:170
bissc_priv::multi_turn_len
int32_t multi_turn_len[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:164
bissc_priv::core_clk_freq
uint32_t core_clk_freq
Definition: bissc_drv.h:208
bissc_clk_cfg
Structure defining EnDat clock configuration for selected frequency.
Definition: bissc_drv.h:103
bissc_control_info::cmd_otf_crc
uint8_t cmd_otf_crc
Definition: bissc_drv.h:145
bissc_position_info::rcv_crc
uint8_t rcv_crc[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:128
bissc_priv::enc_ctrl_data
struct bissc_control_info enc_ctrl_data[NUM_ED_CH_MAX]
Definition: bissc_drv.h:186
bissc_position_info::position
uint64_t position[NUM_ENCODERS_MAX]
Definition: bissc_drv.h:120
bissc_control_info::cmd_result
uint8_t cmd_result
Definition: bissc_drv.h:141
bissc_priv::single_turn_len
int32_t single_turn_len[NUM_ED_CH_MAX][NUM_ENCODERS_MAX]
Definition: bissc_drv.h:162
bissc_priv::uart_clk_freq
uint32_t uart_clk_freq
Definition: bissc_drv.h:210
bissc_clk_cfg::rx_div
uint16_t rx_div
Definition: bissc_drv.h:104