From 8b6a3e7c20ec5315988b0a4cb4e5902a878c5685 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sat, 25 Feb 2023 22:17:01 +0300 Subject: [PATCH] Add PDNuart starting interface (not tested & not yet added to main proto) --- F3:F303/Multistepper/Readme.md | 9 + F3:F303/Multistepper/hardware.c | 3 +- F3:F303/Multistepper/main.c | 2 + F3:F303/Multistepper/multistepper.bin | Bin 28340 -> 29144 bytes F3:F303/Multistepper/multistepper.files | 2 + F3:F303/Multistepper/pdnuart.c | 230 ++++++++++++++++++++++++ F3:F303/Multistepper/pdnuart.h | 26 +++ F3:F303/Multistepper/version.inc | 4 +- 8 files changed, 273 insertions(+), 3 deletions(-) create mode 100644 F3:F303/Multistepper/pdnuart.c create mode 100644 F3:F303/Multistepper/pdnuart.h diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index 64abe75..d3f5790 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -221,4 +221,13 @@ _SW_ used as debugging/sewing; also (I remember about USB pullup only after end * ADC1 - DMA1_ch1 * ADC2 - DMA2_ch1 +* USART2 (PDN-UART for drivers 0..3) - DMA1_ch6 (Rx), DMA1_ch7 (Tx) +* USART3 (PDN-UART for drivers 4..7) - DMA1_ch3 (Rx), DMA1_ch2 (Tx) +* SPI2 (screen) - DMA1_ch4 (Rx), DMA1_ch5 (Tx) [or may be dedicated to USART1] +# Other stepper drivers connection + +## DRV8825 +Solder jumpers E2, B and A to connect ~RST and ~SLP to 3.3V. + +Microstepping selection produced by soldering H2 (bit0), G2 (bit1) and/or C (bit2). \ No newline at end of file diff --git a/F3:F303/Multistepper/hardware.c b/F3:F303/Multistepper/hardware.c index 832826b..ae1433e 100644 --- a/F3:F303/Multistepper/hardware.c +++ b/F3:F303/Multistepper/hardware.c @@ -124,7 +124,8 @@ TRUE_INLINE void gpio_setup(){ | MODER_AF(14) | MODER_AF(15); GPIOB->OSPEEDR = OSPEED_HI(0) | OSPEED_HI(5) | OSPEED_HI(8) | OSPEED_MED(13) | OSPEED_MED(14) | OSPEED_MED(15); GPIOB->OTYPER = 0; - GPIOB->PUPDR = PUPD_PU(7) | PUPD_PU(9) | PUPD_PU(11); + // USART2_Tx (PB3) and USART3_Tx (PB10) are also pullup + GPIOB->PUPDR = PUPD_PU(3) | PUPD_PU(7) | PUPD_PU(9) | PUPD_PU(7) | PUPD_PU(11); GPIOC->ODR = 0; GPIOC->AFR[0] = AFRf(7, 4) | AFRf(7, 5) | AFRf(4, 6); diff --git a/F3:F303/Multistepper/main.c b/F3:F303/Multistepper/main.c index 9570776..5ab68e5 100644 --- a/F3:F303/Multistepper/main.c +++ b/F3:F303/Multistepper/main.c @@ -21,6 +21,7 @@ #include "can.h" #include "flash.h" #include "hardware.h" +#include "pdnuart.h" #include "proto.h" #include "steppers.h" #include "usb.h" @@ -86,5 +87,6 @@ int main(void){ if(ans) USB_sendstr(ans); } process_keys(); + pdnuart_poll(); } } diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 3864bcf21539c52ae904875b56a6d41c8742a99e..36b0a9898e14d940d32f7827dbd8ec7c632de32a 100755 GIT binary patch delta 9822 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 U{{)Zd5L!}@fkdlkTUR9h52yO;@Bjb+ delta 8998 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 diff --git a/F3:F303/Multistepper/multistepper.files b/F3:F303/Multistepper/multistepper.files index 2e2b09c..0202d6d 100644 --- a/F3:F303/Multistepper/multistepper.files +++ b/F3:F303/Multistepper/multistepper.files @@ -15,6 +15,8 @@ hashgen/hdr.c hashgen/hdr.h hashgen/test.c main.c +pdnuart.c +pdnuart.h proto.c proto.h ringbuffer.c diff --git a/F3:F303/Multistepper/pdnuart.c b/F3:F303/Multistepper/pdnuart.c new file mode 100644 index 0000000..4621c47 --- /dev/null +++ b/F3:F303/Multistepper/pdnuart.c @@ -0,0 +1,230 @@ +/* + * This file is part of the multistepper project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "hardware.h" +#include "proto.h" + +extern volatile uint32_t Tms; + +#define MAXBUFLEN (8) +// Rx timeout, ms +#define PDNUART_TIMEOUT (20) + +// buffers format: 0 - sync+reserved, 1 - address (0..3 - slave, 0xff - master) +// 2 - register<<1 | RW, 3 - CRC (r) or [ 3..6 - MSB data, 7 - CRC ] +// buf[0] - USART2, buf[1] - USART3 +static uint8_t inbuf[2][MAXBUFLEN], outbuf[2][MAXBUFLEN]; +static uint8_t Taccess[2] = {0}; // last access time +static int curslaveaddr[2] = {-1, -1}; // current slave address for each USART (0..3) +static uint8_t notfound = 0; // not found mask (LSB - 0, MSB - 7) +static uint8_t readrq[2] = {0}; // ==1 for read request (after send wait to read) + +// UART states +typedef enum{ + PDU_IDLE, + PDU_TX, + PDU_TXREADY, + PDU_RX, + PDU_RXREADY +} pdnuart_state; +static pdnuart_state state[2] = {PDU_IDLE, PDU_IDLE}; + +// datalen == 3 for read request or 7 for writing +static void calcCRC(int no, int datalen){ + uint8_t crc = 0; + for(int i = 0; i < datalen; ++i){ + uint8_t currentByte = outbuf[no][i]; + for(int j = 0; j < 8; ++j){ + if((crc >> 7) ^ (currentByte & 0x01)) crc = (crc << 1) ^ 0x07; + else crc <<= 1; + currentByte = currentByte >> 1; + } + } + outbuf[no][datalen] = crc; +} + +static volatile DMA_Channel_TypeDef *TxDMA[2] = {DMA1_Channel7, DMA1_Channel2}; +static volatile DMA_Channel_TypeDef *RxDMA[2] = {DMA1_Channel6, DMA1_Channel3}; +static volatile USART_TypeDef *USART[2] = {USART2, USART3}; + +static void setup_usart(int no){ + USART[no]->ICR = 0xffffffff; // clear all flags + TxDMA[no]->CCR = 0; + TxDMA[no]->CPAR = (uint32_t) &USART[no]->TDR; // periph + TxDMA[no]->CCR |= DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE; // 8bit, mem++, mem->per, transcompl irq + RxDMA[no]->CCR = 0; + RxDMA[no]->CPAR = (uint32_t) &USART[no]->RDR; // periph + RxDMA[no]->CCR |= DMA_CCR_MINC | DMA_CCR_TCIE; // 8bit, mem++, per->mem, transcompl irq + USART[no]->BRR = 72000000 / 256000; // 256 kbaud + USART[no]->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; // enable DMA Tx/Rx + USART[no]->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART + uint32_t tmout = 16000000; + while(!(USART[no]->ISR & USART_ISR_TC)){if(--tmout == 0) break;} // polling idle frame Transmission + USART[no]->ICR = 0xffffffff; // clear all flags again +} + +// USART2 (ch0..3): DMA1ch6 (Rx), DMA1_ch7 (Tx) +// USART3 (ch4..7): DMA1ch3 (Rx), DMA1_ch2 (Tx) +// pins are setting up in `hardware.c` +void pdnuart_setup(){ + RCC->APB1ENR |= RCC_APB1ENR_USART2EN | RCC_APB1ENR_USART3EN; + RCC->AHBENR |= RCC_AHBENR_DMA1EN; + setup_usart(0); + setup_usart(1); + NVIC_EnableIRQ(DMA1_Channel2_IRQn); + NVIC_EnableIRQ(DMA1_Channel3_IRQn); + NVIC_EnableIRQ(DMA1_Channel6_IRQn); + NVIC_EnableIRQ(DMA1_Channel7_IRQn); +} + +static int rwreg(uint8_t motorno, uint8_t reg, uint32_t data, int w){ + if(motorno >= MOTORSNO || reg & 0x80) return FALSE; + int no = motorno >> 2; + if(state[no] != PDU_IDLE) return FALSE; + outbuf[no][0] = 0xa0; + outbuf[no][1] = curslaveaddr[no] = motorno - (no << 2); + outbuf[no][2] = reg << 1; + int nbytes = 3; + if(w){ + outbuf[no][2] |= 1; + for(int i = 6; i > 2; --i){ + outbuf[no][i] = data & 0xff; + data >>= 8; + } + nbytes = 7; + readrq[no] = 0; + }else{ + readrq[no] = 1; + } + calcCRC(no, nbytes); + TxDMA[no]->CMAR = (uint32_t) outbuf[no]; + TxDMA[no]->CNDTR = nbytes + 1; + TxDMA[no]->CCR |= DMA_CCR_EN; // start transmission + state[no] = PDU_TX; + Taccess[no] = Tms; + return TRUE; +} + +// return FALSE if failed +int pdnuart_writereg(uint8_t motorno, uint8_t reg, uint32_t data){ + return rwreg(motorno, reg, data, 1); +} + +// return FALSE if failed +int pdnuart_readreg(uint8_t motorno, uint8_t reg){ + return rwreg(motorno, reg, 0, 0); +} + +static void disableDMA(int no){ + TxDMA[no]->CCR &= ~DMA_CCR_EN; + RxDMA[no]->CCR &= ~DMA_CCR_EN; + readrq[no] = 0; + state[no] = PDU_IDLE; +} + +static void parseRx(int no){ + USB_sendstr("Got from "); + USB_putbyte('#'); printu(curslaveaddr[no] + no*4); USB_sendstr(": "); + for(int i = 0; i < 8; ++i){ + printuhex(inbuf[no][i]); USB_putbyte(' '); + } + newline(); +} + +void pdnuart_poll(){ + for(int i = 0; i < 2; ++i){ + int showno = 0; + uint32_t time = Tms - Taccess[i]; + switch(state[i]){ + case PDU_TX: + if(time > PDNUART_TIMEOUT){ + USB_sendstr("PDN/UART timeout: Tx problem "); + showno = 1; + disableDMA(i); + } + break; + case PDU_TXREADY: + USB_sendstr("Tx ready "); + showno = 1; + break; + case PDU_RX: + if(time > PDNUART_TIMEOUT){ + USB_sendstr("PDN/UART timeout: no answer "); + notfound |= 1 << (curslaveaddr[i] + 4*i); + showno = 1; + disableDMA(i); + } + break; + case PDU_RXREADY: + parseRx(i); + state[i] = PDU_IDLE; // DMA already turned off + break; + default: // IDLE + return; + } + if(showno){ + USB_putbyte('#'); printu(curslaveaddr[i] + 4*i); newline(); + } + } +} + +// USART2 Tx complete -> prepare Rx +void dma1_channel7_isr(){ + DMA1_Channel7->CCR &= ~DMA_CCR_EN; + DMA1->IFCR |= DMA_IFCR_CTCIF7; + if(!readrq[0]){ // there was a setter + state[0] = PDU_TXREADY; + return; + } + DMA1_Channel6->CMAR = (uint32_t) inbuf[0]; + DMA1_Channel6->CCR |= DMA_CCR_EN; + DMA1_Channel6->CNDTR = MAXBUFLEN; + state[0] = PDU_RX; + Taccess[0] = Tms; +} + +// USART3 Tx complete -> prepare Rx +void dma1_channel2_isr(){ + DMA1_Channel2->CCR &= ~DMA_CCR_EN; + DMA1->IFCR |= DMA_IFCR_CTCIF2; + if(!readrq[1]){ // there was a setter + state[1] = PDU_TXREADY; + return; + } + DMA1_Channel3->CMAR = (uint32_t) inbuf[1]; + DMA1_Channel3->CCR |= DMA_CCR_EN; + DMA1_Channel3->CNDTR = MAXBUFLEN; + state[1] = PDU_RX; + Taccess[1] = Tms; +} + +// USART2 Rx complete -> set flag +void dma1_channel6_isr(){ + DMA1_Channel6->CCR &= ~DMA_CCR_EN; + DMA1->IFCR |= DMA_IFCR_CTCIF6; + state[0] = PDU_RXREADY; +} + +// USART3 Rx complete -> set flag +void dma1_channel3_isr(){ + DMA1_Channel3->CCR &= ~DMA_CCR_EN; + DMA1->IFCR |= DMA_IFCR_CTCIF3; + state[1] = PDU_RXREADY; +} diff --git a/F3:F303/Multistepper/pdnuart.h b/F3:F303/Multistepper/pdnuart.h new file mode 100644 index 0000000..8934025 --- /dev/null +++ b/F3:F303/Multistepper/pdnuart.h @@ -0,0 +1,26 @@ +/* + * This file is part of the multistepper project. + * Copyright 2023 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +void pdnuart_poll(); +void pdnuart_setup(); +int pdnuart_writereg(uint8_t motorno, uint8_t reg, uint32_t data); +int pdnuart_readreg(uint8_t motorno, uint8_t reg); diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index e4c2362..7a4469e 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "80" -#define BUILD_DATE "2023-02-24" +#define BUILD_NUMBER "82" +#define BUILD_DATE "2023-02-25"