|
@@ -39,8 +39,6 @@ typedef enum {
|
|
|
/* USER CODE BEGIN PD */
|
|
|
#define SPI_BUFFER_SIZE 5
|
|
|
|
|
|
-#define RTC_RX_BUF_SIZE 0x12
|
|
|
-#define RTC_TX_BUF_SIZE 7
|
|
|
/* USER CODE END PD */
|
|
|
|
|
|
/* Private macro -------------------------------------------------------------*/
|
|
@@ -73,8 +71,7 @@ static const uint16_t nixieCathodeMap[4][10] = {
|
|
|
};
|
|
|
static const uint8_t nixieCathodeMask[4][2] = {{0x00, 0x3f}, {0xc0, 0x0f}, {0xf0, 0x03}, {0xc0, 0x00}};
|
|
|
static uint8_t tubesBuffer[SPI_BUFFER_SIZE] = {0};
|
|
|
-static uint8_t i2cBufTX[RTC_TX_BUF_SIZE] = {0};
|
|
|
-static uint8_t i2cBufRX[RTC_RX_BUF_SIZE] = {0};
|
|
|
+static rtc_t Clock;
|
|
|
|
|
|
/* USER CODE END PV */
|
|
|
|
|
@@ -91,8 +88,6 @@ static void MX_TIM17_Init(void);
|
|
|
/* USER CODE BEGIN PFP */
|
|
|
static void showDigit(tube_pos_t pos, uint8_t dig);
|
|
|
static void SPI_StartTX(void);
|
|
|
-static void RTC_Init(void);
|
|
|
-static void RTC_ReadAll(void);
|
|
|
/* USER CODE END PFP */
|
|
|
|
|
|
/* Private user code ---------------------------------------------------------*/
|
|
@@ -172,34 +167,19 @@ int main(void)
|
|
|
/* Set DMA data transfer length (SPI buffer length). */
|
|
|
DMA1_Channel1->CNDTR = SPI_BUFFER_SIZE;
|
|
|
|
|
|
- /* Source: Address of the I2C RX buffer. */
|
|
|
- DMA1_Channel2->CMAR = (uint32_t)&i2cBufRX;
|
|
|
- /* Destination: I2C RX data register. */
|
|
|
- DMA1_Channel2->CPAR = (uint32_t)&(I2C1->RXDR);
|
|
|
- /* Set DMA data transfer length (I2C RX buffer length). */
|
|
|
- DMA1_Channel2->CNDTR = RTC_RX_BUF_SIZE;
|
|
|
-
|
|
|
- /* Source: Address of the I2C TX buffer. */
|
|
|
- DMA1_Channel3->CMAR = (uint32_t)&i2cBufTX;
|
|
|
- /* Destination: I2C TX data register. */
|
|
|
- DMA1_Channel3->CPAR = (uint32_t)&(I2C1->TXDR);
|
|
|
- /* Set DMA data transfer length (I2C TX buffer length). */
|
|
|
- DMA1_Channel3->CNDTR = RTC_TX_BUF_SIZE;
|
|
|
-
|
|
|
/* Enable SPI+DMA transfer */
|
|
|
SPI1->CR2 |= SPI_CR2_TXDMAEN;
|
|
|
SPI1->CR1 |= SPI_CR1_SPE;
|
|
|
|
|
|
- /* Enable DMA channels for I2C */
|
|
|
- DMA1_Channel2->CCR |= DMA_CCR_EN; // LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2);
|
|
|
- DMA1_Channel3->CCR |= DMA_CCR_EN; // LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3);
|
|
|
-
|
|
|
/* USER CODE END 2 */
|
|
|
|
|
|
/* USER CODE BEGIN WHILE */
|
|
|
- RTC_Init();
|
|
|
+ SPI_StartTX();
|
|
|
|
|
|
IN15_OFF;
|
|
|
+ IN15_P;
|
|
|
+ RTC_ReadAll(&Clock);
|
|
|
+ while (Flag.I2C_RX_End == 0) {};
|
|
|
|
|
|
/* Infinite loop */
|
|
|
while (1)
|
|
@@ -214,7 +194,7 @@ int main(void)
|
|
|
showDigit(Tube_E, 4);
|
|
|
SPI_StartTX();
|
|
|
*/
|
|
|
- RTC_ReadAll();
|
|
|
+ RTC_ReadAll(&Clock);
|
|
|
|
|
|
if (Flag.RTC_IRQ != 0) {
|
|
|
Flag.RTC_IRQ = 0;
|
|
@@ -231,10 +211,10 @@ int main(void)
|
|
|
showDigit(Tube_D, 7);
|
|
|
showDigit(Tube_E, 8);
|
|
|
*/
|
|
|
- showDigit(Tube_A, i2cBufRX[1] >> 4);
|
|
|
- showDigit(Tube_B, i2cBufRX[1] & 0xf);
|
|
|
- showDigit(Tube_D, i2cBufRX[0] >> 4);
|
|
|
- showDigit(Tube_E, i2cBufRX[0] & 0xf);
|
|
|
+ showDigit(Tube_A, Clock.Min >> 4);
|
|
|
+ showDigit(Tube_B, Clock.Min & 0xf);
|
|
|
+ showDigit(Tube_D, Clock.Sec >> 4);
|
|
|
+ showDigit(Tube_E, Clock.Sec & 0xf);
|
|
|
SPI_StartTX();
|
|
|
|
|
|
//__WFI();
|
|
@@ -247,64 +227,6 @@ static void SPI_StartTX(void) {
|
|
|
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
|
|
|
}
|
|
|
|
|
|
-static void RTC_Init(void) {
|
|
|
- /* Clear flags */
|
|
|
- Flag.I2C_RX_End = 0;
|
|
|
- Flag.I2C_TX_End = 0;
|
|
|
- return;
|
|
|
- /* Wait for I2C */
|
|
|
- while ( I2C1->ISR & I2C_ISR_BUSY ) {};
|
|
|
-
|
|
|
- /* Fill buffer with register address and register value */
|
|
|
- i2cBufTX[0] = DS3231_CONTROL_ADDR;
|
|
|
- i2cBufTX[1] = 0x0; // set 1 Hz output squware
|
|
|
- i2cBufTX[2] = 0x0; // disable 32 kHz output
|
|
|
-
|
|
|
- LL_I2C_SetSlaveAddr(I2C1, I2C_ADDR_RTC);
|
|
|
-// LL_I2C_SetTransferRequest(I2C1, LL_I2C_REQUEST_WRITE);
|
|
|
- LL_I2C_SetTransferSize(I2C1, 3); // controll addr + 2 bytes of data
|
|
|
-// LL_I2C_EnableDMAReq_TX(I2C1);
|
|
|
-// LL_I2C_GenerateStartCondition(I2C1);
|
|
|
-
|
|
|
- /* Set AUTOEND mode, the device address and number bytes to send. */
|
|
|
-// I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES);
|
|
|
-// I2C1->CR2 = ( I2C_ADDR_RTC << I2C_CR2_SADD_Pos | 3 << I2C_CR2_NBYTES_Pos );
|
|
|
- /* Enable I2C DMA requests. */
|
|
|
- I2C1->CR1 |= ( I2C_CR1_TXDMAEN );
|
|
|
- /* Send a start signal. */
|
|
|
- I2C1->CR2 |= ( I2C_CR2_START );
|
|
|
- /* (DMA is now running.) */
|
|
|
-}
|
|
|
-
|
|
|
-static void RTC_ReadAll(void) {
|
|
|
-
|
|
|
- while ( I2C1->ISR & I2C_ISR_BUSY ) {};
|
|
|
-/*
|
|
|
- DMA1_Channel3->CMAR = (uint32_t)&i2cBufTX;
|
|
|
- DMA1_Channel3->CPAR = (uint32_t)&(I2C1->TXDR);
|
|
|
- DMA1_Channel3->CNDTR = RTC_TX_BUF_SIZE;
|
|
|
-*/
|
|
|
- LL_I2C_SetSlaveAddr(I2C1, I2C_ADDR_RTC);
|
|
|
- LL_I2C_SetTransferRequest(I2C1, LL_I2C_REQUEST_WRITE);
|
|
|
- LL_I2C_SetTransferSize(I2C1, 1);
|
|
|
-// i2cBufTX[0] = DS3231_TIME_CAL_ADDR;
|
|
|
-// LL_I2C_EnableDMAReq_TX(I2C1);
|
|
|
- LL_I2C_GenerateStartCondition(I2C1);
|
|
|
- while ( !( I2C1->CR2 & I2C_CR2_START ) ) {};
|
|
|
- I2C1->TXDR = 0x0;
|
|
|
-
|
|
|
- while ( I2C1->ISR & I2C_ISR_BUSY ) {};
|
|
|
-
|
|
|
- Flag.I2C_RX_End = 0;
|
|
|
- Flag.I2C_TX_End = 0;
|
|
|
- /* Reading all from address 00h */
|
|
|
- LL_I2C_SetSlaveAddr(I2C1, I2C_ADDR_RTC);
|
|
|
- LL_I2C_SetTransferRequest(I2C1, LL_I2C_REQUEST_READ);
|
|
|
- LL_I2C_SetTransferSize(I2C1, 0x12); // Clock + Calendar = 7 bytes
|
|
|
- LL_I2C_EnableDMAReq_RX(I2C1);
|
|
|
- LL_I2C_GenerateStartCondition(I2C1);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* @brief System Clock Configuration
|
|
|
* @retval None
|
|
@@ -393,7 +315,7 @@ static void MX_I2C1_Init(void)
|
|
|
|
|
|
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PRIORITY_MEDIUM);
|
|
|
|
|
|
- LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MODE_CIRCULAR);
|
|
|
+// LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MODE_CIRCULAR);
|
|
|
|
|
|
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_2, LL_DMA_PERIPH_NOINCREMENT);
|
|
|
|
|
@@ -410,7 +332,7 @@ static void MX_I2C1_Init(void)
|
|
|
|
|
|
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PRIORITY_MEDIUM);
|
|
|
|
|
|
- LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR);
|
|
|
+// LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR);
|
|
|
|
|
|
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_PERIPH_NOINCREMENT);
|
|
|
|