Page 1 of 2

Working with Netduino Plus 2 - clock for ENC28J60

Posted: Wed Nov 23, 2022 5:45 pm
by jarwil
Hello!

I want to enable ethernet on Netduino Plus 2 board but I do not know how to setup output port A8 as a clock 25MHz.
The problem is because on Netduino Plus 2 board ENC28J60 does not have own oscillator. Instead of the clock signal from MCO1 was used.

Another problem is MISO connected to PB4 and SS connected to PC8 but I think I can change it in ENC28J60Network.h

Is there anyone who can help me enable clock on PA8?

Thank you in advance.

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Thu Nov 24, 2022 1:33 am
by ozcar
From a quick look there does not seem to be a board definition for that, so you might have to create one yourself.

Have a look here: https://github.com/stm32duino/wiki/wiki ... 28board%29.

The board appears to have a 25MHz crystal, so you want to set up the clock config for that. There might be some decisions to make there, or maybe you can find somewhere how it was set up for .NET (something I know nothing about).

For the MCO part, I think this should do what you want (but TBH, the only time I needed to setup MCO I just wrote directly to the registers).

Code: Select all

HAL_RCC_MCOConfig(RCC_MCO1,  RCC_MCO1SOURCE_HSE,  RCC_MCODIV_1);

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Thu Nov 24, 2022 10:02 pm
by jarwil
Thank you.

Probably this is what I am looking for but it's not working right now

I read that the generic boards (I am using Generic STM32F4 series > Generic F405RGTx) have internal clock enabled so probably for this reason I have noisy wave on PA8.

When I change second parameter to RCC_MCO1SOURCE_HSI I can get 16MHz square waveform.

Now I am reading how to change the internal clock to external crystal oscillator and I am trying add a new variant.

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Thu Nov 24, 2022 11:13 pm
by jarwil
I am stuck. I don't know how to use the STM32CubeMX tool. Anyone can support me configure the external crystal for board Netduino Plus 2?

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Fri Nov 25, 2022 10:09 am
by ozcar
I see there is at least one existing F4 board with 25MHz HSE, called "Blue F407VET mini".

Perhaps you could try with the generic F405GTx board definition, with SystemClock_Config() copied into your sketch from https://github.com/stm32duino/Arduino_C ... E_MINI.cpp

Take the WEAK off that and replace it with extern "C" as mentioned at the bottom of this page: https://github.com/stm32duino/wiki/wiki ... ock_config

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Fri Nov 25, 2022 8:49 pm
by jarwil
Taa daaaaa!!!
ping.png
ping.png (6.22 KiB) Viewed 1146 times
Thank you ozcar!
At PA8 now I have beautiful sinus 25MHz.

Success is but my satisfaction is about 95% :D

At this time I had to change MISO to PB4 and CS to PC8

I have tried to do it like this in my sketch:

Code: Select all

SPI = SPIClass(PA7, PB4, PA5, PC8);
SPI.begin(PC8);
and also like this:

Code: Select all

SPI.setMISO(PB4);
SPI.setMOSI(PA7);
SPI.setSCLK(PA5);
SPI.setSSEL(PC8);
without success :?

In the end, I did it in a very inelegant way.
I changed the MISO directly in SPI library (SPI.cpp file)

Code: Select all

SPIClass::SPIClass() : _CSPinConfig(NO_CONFIG)
{
  _spi.pin_miso = digitalPinToPinName(PB4); //MISO);
  _spi.pin_mosi = digitalPinToPinName(MOSI);
  _spi.pin_sclk = digitalPinToPinName(SCK);
  _spi.pin_ssel = NC;
}
and PC8 I setup in my *.ino file

Code: Select all

Ethernet.init(PC8);
It's not clear to me why the above two methods I tried don't work (with SPI=... and SPI.set...)

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Sat Nov 26, 2022 6:03 pm
by jarwil
I read the SPI API manual and now everything is clear. https://github.com/stm32duino/wiki/wiki ... unctions-1 I shouldn't set SSEL pin.

To sum up, to run ethernet on Netduino Plus 2 it is necessary:
1. set the clock

Code: Select all

extern "C" void SystemClock_Config(void)
{

	RCC_OscInitTypeDef RCC_OscInitStruct = {};
	RCC_ClkInitTypeDef RCC_ClkInitStruct = {};

	/**Configure the main internal regulator output voltage
	*/
	__HAL_RCC_PWR_CLK_ENABLE();

	__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

	/**Initializes the CPU, AHB and APB busses clocks
	*/
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	RCC_OscInitStruct.HSEState = RCC_HSE_ON;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
	RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
	RCC_OscInitStruct.PLL.PLLM = 25;
	RCC_OscInitStruct.PLL.PLLN = 336;
	RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
	RCC_OscInitStruct.PLL.PLLQ = 7;
	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
		Error_Handler();
	}

	/**Initializes the CPU, AHB and APB busses clocks
	*/
	RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
		| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
	RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

	if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
		Error_Handler();
	}

	/* Ensure CCM RAM clock is enabled */
	__HAL_RCC_CCMDATARAMEN_CLK_ENABLE();

}
2. set PA8 as clock for enc28J60
3. set the pins for SPI

Code: Select all

void setup()
{
	//clock setup
	//SystemClock_Config(); (extern)
	
	//PA8 as clock for enc28J60
	HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
	
	//PB4 as MISO
	SPI.setMISO(PB4);
	
	//PC8 as chip sellect
	Ethernet.init(PC8);
	
	//start ethernet
	Ethernet.begin(mac, Eth_ModuleIP);
}

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Sat Nov 26, 2022 7:26 pm
by ozcar
Good that you got it working.

I would have thought that your SystemClock_Config() would get used anyway without you having to call it from setup() though.

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Sat Nov 26, 2022 10:22 pm
by jarwil
I have never use the extern declaration.
Thank you - now I know how it works.

Re: Working with Netduino Plus 2 - clock for ENC28J60

Posted: Sun Nov 27, 2022 12:05 am
by jarwil
I'll have to dig into the clock setup.
Using the millis() function to count the time, it turns out that 1s is actually 327ms.
As a result, libraries that use the millis() and micros() functions (for sensor DHT22 and for RC5) do not work.
Above proportion similar to 25000000 and 8000000
Should I change 8000000 to 25000000 in any other file? Something tells me that somewhere I should change HSE_VALUE.