This commit is contained in:
Ethan Zonca 2015-06-10 08:16:40 -04:00
commit 52803f72f5
8 changed files with 209 additions and 61 deletions

View File

@ -2,9 +2,15 @@
#define _CAN_H #define _CAN_H
enum can_bitrate { enum can_bitrate {
CAN_BITRATE_500K, CAN_BITRATE_10K,
CAN_BITRATE_250K, CAN_BITRATE_20K,
CAN_BITRATE_50K,
CAN_BITRATE_100K,
CAN_BITRATE_125K, CAN_BITRATE_125K,
CAN_BITRATE_250K,
CAN_BITRATE_500K,
CAN_BITRATE_750K,
CAN_BITRATE_1000K,
}; };
enum can_bus_state { enum can_bus_state {

View File

@ -86,7 +86,11 @@ CFLAGS += -mcpu=$(CPU) -mthumb
CFLAGS += $(USER_CFLAGS) CFLAGS += $(USER_CFLAGS)
# default action: build the user application # default action: build the user application
all: $(BUILD_DIR)/$(TARGET).hex all: $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).hex
flash: all
sudo dfu-util -d 0483:df11 -c 1 -i 0 -a 0 -s 0x08000000 -D $(BUILD_DIR)/$(TARGET).bin
####################################### #######################################
# build the st micro peripherial library # build the st micro peripherial library
@ -149,6 +153,9 @@ $(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf
$(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@ $(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin $(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin
$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(USB_OBJECTS) $(CUBELIB) $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(USB_OBJECTS) $(CUBELIB)
$(CC) -o $@ $(CFLAGS) $(OBJECTS) $(USB_OBJECTS) \ $(CC) -o $@ $(CFLAGS) $(OBJECTS) $(USB_OBJECTS) \
$(LDFLAGS) -Xlinker \ $(LDFLAGS) -Xlinker \

View File

@ -26,6 +26,8 @@ With OpenOCD running, arm-none-eabi-gdb can be used to load code and debug.
## Contributors ## Contributors
- [Ethan Zonca](https://github.com/normaldotcom) - Makefile fixes and code size optimization - [Ethan Zonca](https://github.com/normaldotcom) - Makefile fixes and code size optimization
- [onejope](https://github.com/onejope) - Fixes to extended ID handling
- Phil Wise - Added dfu-util compatibility to Makefile
## License ## License

View File

@ -3,6 +3,7 @@
CAN_HandleTypeDef hcan; CAN_HandleTypeDef hcan;
CAN_FilterConfTypeDef filter; CAN_FilterConfTypeDef filter;
uint32_t prescaler;
enum can_bus_state bus_state; enum can_bus_state bus_state;
void can_init(void) { void can_init(void) {
@ -19,8 +20,16 @@ void can_init(void) {
filter.BankNumber = 0; filter.BankNumber = 0;
filter.FilterActivation = ENABLE; filter.FilterActivation = ENABLE;
// default to 125 kbit/s
prescaler = 48;
hcan.Instance = CAN; hcan.Instance = CAN;
hcan.Init.Prescaler = 48; bus_state = OFF_BUS;
}
void can_enable(void) {
uint32_t status;
if (bus_state == OFF_BUS) {
hcan.Init.Prescaler = prescaler;
hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SJW = CAN_SJW_1TQ; hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_4TQ; hcan.Init.BS1 = CAN_BS1_4TQ;
@ -31,15 +40,6 @@ void can_init(void) {
hcan.Init.NART = DISABLE; hcan.Init.NART = DISABLE;
hcan.Init.RFLM = DISABLE; hcan.Init.RFLM = DISABLE;
hcan.Init.TXFP = DISABLE; hcan.Init.TXFP = DISABLE;
bus_state = OFF_BUS;
//status = HAL_CAN_Init(&hcan);
}
void can_enable(void) {
uint32_t status;
if (bus_state == OFF_BUS) {
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.pTxMsg = NULL; hcan.pTxMsg = NULL;
status = HAL_CAN_Init(&hcan); status = HAL_CAN_Init(&hcan);
status = HAL_CAN_ConfigFilter(&hcan, &filter); status = HAL_CAN_ConfigFilter(&hcan, &filter);
@ -64,15 +64,45 @@ void can_set_bitrate(enum can_bitrate bitrate) {
} }
switch (bitrate) { switch (bitrate) {
case CAN_BITRATE_500K: case CAN_BITRATE_10K:
hcan.Init.Prescaler = 12; prescaler = 600;
break; break;
case CAN_BITRATE_250K: case CAN_BITRATE_20K:
hcan.Init.Prescaler = 24; prescaler = 300;
break;
case CAN_BITRATE_50K:
prescaler = 120;
break;
case CAN_BITRATE_100K:
prescaler = 60;
break; break;
case CAN_BITRATE_125K: case CAN_BITRATE_125K:
hcan.Init.Prescaler = 48; prescaler = 48;
break; break;
case CAN_BITRATE_250K:
prescaler = 24;
break;
case CAN_BITRATE_500K:
prescaler = 12;
break;
case CAN_BITRATE_750K:
prescaler = 8;
break;
case CAN_BITRATE_1000K:
prescaler = 6;
break;
}
}
void can_set_silent(uint8_t silent) {
if (bus_state == ON_BUS) {
// cannot set silent mode while on bus
return;
}
if (silent) {
hcan.Init.Mode = CAN_MODE_SILENT;
} else {
hcan.Init.Mode = CAN_MODE_NORMAL;
} }
} }

View File

@ -80,33 +80,67 @@ int8_t slcan_parse_str(char *buf, uint8_t len) {
// open channel command // open channel command
can_enable(); can_enable();
return 0; return 0;
} else if (buf[0] == 'C') { } else if (buf[0] == 'C') {
// close channel command // close channel command
can_disable(); can_disable();
return 0; return 0;
} else if (buf[0] == 'S') { } else if (buf[0] == 'S') {
// set bitrate command // set bitrate command
switch(buf[1]) { switch(buf[1]) {
case 0: case 0:
can_set_bitrate(CAN_BITRATE_125K); can_set_bitrate(CAN_BITRATE_10K);
break; break;
case 1: case 1:
can_set_bitrate(CAN_BITRATE_250K); can_set_bitrate(CAN_BITRATE_20K);
break; break;
case 2: case 2:
can_set_bitrate(CAN_BITRATE_50K);
break;
case 3:
can_set_bitrate(CAN_BITRATE_100K);
break;
case 4:
can_set_bitrate(CAN_BITRATE_125K);
break;
case 5:
can_set_bitrate(CAN_BITRATE_250K);
break;
case 6:
can_set_bitrate(CAN_BITRATE_500K); can_set_bitrate(CAN_BITRATE_500K);
break; break;
case 7:
can_set_bitrate(CAN_BITRATE_750K);
break;
case 8:
can_set_bitrate(CAN_BITRATE_1000K);
break;
default: default:
// invalid setting // invalid setting
return -1; return -1;
} }
return 0; return 0;
} else if (buf[0] == 'm' || buf[0] == 'M') {
// set mode command
if (buf[1] == 1) {
// mode 1: silent
can_set_silent(1);
} else {
// default to normal mode
can_set_silent(0);
}
return 0;
} else if (buf[0] == 't' || buf[0] == 'T') { } else if (buf[0] == 't' || buf[0] == 'T') {
// transmit data frame command // transmit data frame command
frame.RTR = CAN_RTR_DATA; frame.RTR = CAN_RTR_DATA;
} else if (buf[0] == 'r' || buf[0] == 'R') { } else if (buf[0] == 'r' || buf[0] == 'R') {
frame.RTR = CAN_RTR_REMOTE;
// transmit remote frame command // transmit remote frame command
frame.RTR = CAN_RTR_REMOTE;
} else { } else {
// error, unknown command // error, unknown command
return -1; return -1;
@ -121,14 +155,25 @@ int8_t slcan_parse_str(char *buf, uint8_t len) {
return -1; return -1;
} }
uint8_t id_len = frame.IDE == CAN_ID_EXT ? SLCAN_EXT_ID_LEN : SLCAN_STD_ID_LEN;
frame.StdId = 0; frame.StdId = 0;
frame.ExtId = 0;
if (frame.IDE == CAN_ID_EXT) {
uint8_t id_len = SLCAN_EXT_ID_LEN;
i = 1; i = 1;
while (i <= id_len) { while (i <= id_len) {
frame.StdId += buf[i++]; frame.ExtId *= 16;
frame.StdId *= 16; frame.ExtId += buf[i++];
} }
frame.StdId /= 16; }
else {
uint8_t id_len = SLCAN_STD_ID_LEN;
i = 1;
while (i <= id_len) {
frame.StdId *= 16;
frame.StdId += buf[i++];
}
}
frame.DLC = buf[i++]; frame.DLC = buf[i++];
if (frame.DLC < 0 || frame.DLC > 8) { if (frame.DLC < 0 || frame.DLC > 8) {

View File

@ -81,12 +81,6 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN CAN_MspInit 1 */ /* USER CODE BEGIN CAN_MspInit 1 */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
GPIO_InitStruct.Alternate = 0;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE END CAN_MspInit 1 */ /* USER CODE END CAN_MspInit 1 */
} }

View File

@ -0,0 +1,64 @@
; Windows CANtact CDC ACM Setup File
; Copyright (c) 2000 Microsoft Corporation
[DefaultInstall]
CopyINF="cantact.inf"
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MFGNAME%
DriverVer=7/1/2012,10.0.0.0
[Manufacturer]
%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64
[SourceDisksNames]
[SourceDisksFiles]
[DestinationDirs]
DefaultDestDir=12
[DriverInstall]
Include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=DriverInstall.AddReg
[DriverInstall.Services]
Include=mdmcpq.inf
AddService=usbser, 0x00000002, LowerFilter_Service_Inst
[DriverInstall.AddReg]
HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider"
;------------------------------------------------------------------------------
; Vendor and Product ID Definitions
;------------------------------------------------------------------------------
; When developing your USB device, the VID and PID used in the PC side
; application program and the firmware on the microcontroller must match.
; Modify the below line to use your VID and PID. Use the format as shown below.
; Note: One INF file can be used for multiple devices with different VID and PIDs.
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
;------------------------------------------------------------------------------
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
[DeviceList.NTx86]
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
[DeviceList.NTia64]
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
;------------------------------------------------------------------------------
; String Definitions
;------------------------------------------------------------------------------
;Modify these strings to customize your device
;------------------------------------------------------------------------------
[Strings]
MFGNAME="http://www.cantact.io"
DESCRIPTION="CANtact USB/CAN Device"