Check this out: https://www.digikey.com/product-deta...9-2-ND/1002104
Found it from this search: https://www.digikey.com/products/en/...=1&pageSize=25
Check this out: https://www.digikey.com/product-deta...9-2-ND/1002104
Found it from this search: https://www.digikey.com/products/en/...=1&pageSize=25
has anyone noticed that USB Serial doesn't work if compile and upload a blank sketch?
(I think we are on page 100 now 8)
Pin 0 - probably because stupid bug/assumption in test sketch: if (next_pin_number != 0) {
Obviously could be done differently... like maybe simply a bool saying we have a new number and use it...
I think there may be a care package from PJRC at our mailbox which I should pick up later today or tomorrow.
Might have to go back to town as have dead battery in tractor... Although lifting probably lifting big battery does not help hernia...
As for SPI1, I don't think with our ILI9488 driver we care about being a CS pin. So more or less any valid digital pin should be fine.
@Defragster:
I remember you did something with the RTC - the example TimeTeensy3 does not work for me - do you have any hints? I think there is some code missing?
@mjs513 - You might try changing in SPI.cpp
toCode:const SPIClass::SPI_Hardware_t SPIClass::spiclass_lpspi3_hardware = { CCM_CCGR1, CCM_CCGR1_LPSPI3(CCM_CCGR_ON), DMAMUX_SOURCE_LPSPI3_TX, DMAMUX_SOURCE_LPSPI3_RX, _spi_dma_rxISR1, 1, 7 | 0x10, 26, 7 | 0x10, 27, 7 | 0x10, 0, 7 | 0x10, IOMUXC_LPSPI3_SCK_SELECT_INPUT, IOMUXC_LPSPI3_SDI_SELECT_INPUT, IOMUXC_LPSPI3_SDO_SELECT_INPUT, IOMUXC_LPSPI3_PCS0_SELECT_INPUT, 1, 1, 0, 0 };
If I am looking correct at pages 842-843 in new manual...Code:const SPIClass::SPI_Hardware_t SPIClass::spiclass_lpspi3_hardware = { CCM_CCGR1, CCM_CCGR1_LPSPI3(CCM_CCGR_ON), DMAMUX_SOURCE_LPSPI3_TX, DMAMUX_SOURCE_LPSPI3_RX, _spi_dma_rxISR1, 1, 7 | 0x10, 26, 2 | 0x10, 27, 7 | 0x10, 0, 7 | 0x10, IOMUXC_LPSPI3_SCK_SELECT_INPUT, IOMUXC_LPSPI3_SDI_SELECT_INPUT, IOMUXC_LPSPI3_SDO_SELECT_INPUT, IOMUXC_LPSPI3_PCS0_SELECT_INPUT, 1, 0, 1, 0 };
@Paul, looks like the RTC is connected to the SNVS - I can't download the security reference manual.
I think it's up to you to add the code for RTC.. otherwise I'd do it.
Frank - this should be what you need to start and get RTC secs ....
I didn't get it converted to TIME's tmElements_t, Just using some code - to watch it counting seconds. It does store time value that I put in the Secs_since_1970 and it worked to increment and maintain. I think that is the base of the TimeLib.h?
FrankB - BTW - Battery-backed-NV-RAM not as big as on the T_3.x's::Is that the 128 bits here?: IMXRT_IOMUXC_SNVS_GPR (*(IMXRT_REGISTER32_t *)0x400A4000)19.4.2.1 Using the General-Purpose Register
SNVS implements a 128-bit general-purpose register allows software to store a small
amount of data.
Cool Tim - Thank you and WMXZ of course![]()
Teensy 4 beta2 (1062) testing observations:
- stencil on MCU: MIMXRT1062 DVL6A 0N00X CTAA1848H
- blink power consumption (including green power LED) LED off/on 105/108 ma
- crystal drift with GPT and GPS pps: 24mhz 1 ppm, RTC (32768 hz) -6 ppm
- chip temp @600mhz 37.5 C
- MAC address 04E9E508D7A3
- 10 GPIO toggles 119 cycles, with fast GPIO 18 cycles
- coremark (Fastest @600mhz) 2427.4 iterations/sec
- audio adapter SPI (T4 pins 10-13) uSD listfiles worked with SanDisk (failed with Kingston microSD)
- BUILTIN_SDCARD listfiles works for both SanDisk and Kingston microSD
- RTC tests fail, no definition for __rtc_localtime (RTC is running). FIX: boards.txt post #668
- edge pin tests: PWM, INPUT_PULLUP, analog, attachInterrupt, and loopback tests on Serial1-5 (no pogo pins for Serial 6 and 7)
- working: TRNG, CRC32, SHA256, AES
Most tests with 1.8.8 1.46-beta11
Last edited by manitou; 04-27-2019 at 01:09 PM.
@mjs513 looks like it is time for me to try to debug some of this.
Probably won't go back into town today...
I debugged SPI2, using an SPI test app I had earlier which I should simplify...
Which appears to be hanging on the start of small buffer... So will try to debug...Code:#include <SPI.h> #include <EventResponder.h> #define SPIT SPI2 #define DBGSerial Serial #define CS_PIN 36 #define SMALL_TRANSFER_SIZE 128 #define BUFFER_SIZE 0x12000l // More than 64K //uint8_t buffer[BUFFER_SIZE]; uint8_t *buffer; // lets malloc it... //uint8_t rxBuffer[SMALL_TRANSFER_SIZE]; DMAMEM uint8_t rxBuffer[BUFFER_SIZE]; //uint8_t *rxBuffer; uint8_t *foo_bar = nullptr; uint8_t static_buffer[16]; EventResponder event; volatile bool event_happened = false; void asyncEventResponder(EventResponderRef event_responder) { digitalWriteFast(CS_PIN, HIGH); event_happened = true; } void setup() { // debug pins uint8_t stack_buffer[10]; pinMode(0, OUTPUT); pinMode(1, OUTPUT); digitalWrite(0, LOW); digitalWrite(1, LOW); extern unsigned long _heap_start; extern unsigned long _heap_end; pinMode(CS_PIN, OUTPUT); digitalWriteFast(CS_PIN, HIGH); while (!Serial && millis() < 4000) ; // wait for Serial port DBGSerial.begin(115200); delay(500); DBGSerial.println("SPI Test program"); SPIT.begin(); buffer = (uint8_t *)malloc(BUFFER_SIZE); //rxBuffer = (uint8_t *)malloc(BUFFER_SIZE); DBGSerial.print("Buffer: "); DBGSerial.print((uint32_t)buffer, HEX); DBGSerial.print(" RX Buffer: "); DBGSerial.print((uint32_t)rxBuffer, HEX); DBGSerial.print(" "); DBGSerial.println(BUFFER_SIZE, DEC); DBGSerial.printf("Static buffer: %x, Stack Buffer: %x\n", (uint32_t)static_buffer, (uint32_t)stack_buffer); DBGSerial.printf("Heap Start: %x, Heap End: %x\n", (uint32_t)&_heap_start, (uint32_t)&_heap_end); event.attachImmediate(&asyncEventResponder); } int nn = 0; void loop() { // while (DBGSerial.read() != -1) ; // Make sure queue is empty. // DBGSerial.println("Press any key to run test"); //while (!DBGSerial.available()) ; // will loop until it receives something // while (DBGSerial.read() != -1) ; // loop until queue is empty DBGSerial.println("Ready to start tests"); SPIT.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); DBGSerial.println("After Begin Transaction"); //================================================================= // Transfer Sync //================================================================= for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Transfer Small"); //DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, rxBuffer, SMALL_TRANSFER_SIZE); digitalWriteFast(CS_PIN, HIGH); DBGSerial.println("*** Completed ***"); DBGSerial.flush(); dumpBuffer(buffer, SMALL_TRANSFER_SIZE); DBGSerial.println(); dumpBuffer(rxBuffer, SMALL_TRANSFER_SIZE); validateTXBuffer(0); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; DBGSerial.println("write Small"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, NULL, SMALL_TRANSFER_SIZE); digitalWriteFast(CS_PIN, HIGH); DBGSerial.println("*** Completed ***"); DBGSerial.flush(); validateTXBuffer(0); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; DBGSerial.println("read Small"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(NULL, rxBuffer, SMALL_TRANSFER_SIZE); digitalWriteFast(CS_PIN, HIGH); DBGSerial.println("*** Completed ***"); DBGSerial.flush(); dumpBuffer(rxBuffer, SMALL_TRANSFER_SIZE); delay(5); SPIT.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); for (uint32_t i = 0; i < BUFFER_SIZE; i++)buffer[i] = i / 1024; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Transfer Full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, rxBuffer, BUFFER_SIZE); digitalWriteFast(CS_PIN, HIGH); validateTXBuffer(1); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i / 1024; DBGSerial.println("write full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, NULL, BUFFER_SIZE); digitalWriteFast(CS_PIN, HIGH); validateTXBuffer(1); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; DBGSerial.println("read full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(NULL, buffer, BUFFER_SIZE); digitalWriteFast(CS_PIN, HIGH); delay(5); //================================================================= // Transfer Async //================================================================= for (uint32_t i = 0; i < 5; i++) { digitalWriteFast(CS_PIN, LOW); delay(1); digitalWriteFast(CS_PIN, HIGH); delay(1); } event_happened = false; for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; DBGSerial.println("Async write Small"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, NULL, SMALL_TRANSFER_SIZE, event); DBGSerial.println("After write call, waiting for event"); while (!event_happened) ; event_happened = false; validateTXBuffer(0); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Async Transfer Small"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, rxBuffer, SMALL_TRANSFER_SIZE, event); DBGSerial.println("After Transfer call, waiting for event"); while (!event_happened) ; event_happened = false; dumpBuffer(buffer, SMALL_TRANSFER_SIZE); DBGSerial.println(); dumpBuffer(rxBuffer, SMALL_TRANSFER_SIZE); validateTXBuffer(0); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Async read Small"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.setTransferWriteFill(0x42); SPIT.transfer(NULL, rxBuffer, SMALL_TRANSFER_SIZE, event); //arm_dcache_delete(rxBuffer, SMALL_TRANSFER_SIZE); while (!event_happened) ; event_happened = false; dumpBuffer(rxBuffer, SMALL_TRANSFER_SIZE); validateTXBuffer(0); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i / 1024; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Async Transfer Full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, rxBuffer, BUFFER_SIZE, event); while (!event_happened) ; event_happened = false; dumpBuffer(rxBuffer, 512); validateTXBuffer(1); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i / 1024; DBGSerial.println("Async write full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(buffer, NULL, BUFFER_SIZE, event); while (!event_happened) ; event_happened = false; validateTXBuffer(1); delay(5); for (uint32_t i = 0; i < BUFFER_SIZE; i++) buffer[i] = i & 0xff; for (uint32_t i = 0; i < BUFFER_SIZE; i++) rxBuffer[i] = 0x5a; DBGSerial.println("Async read full"); DBGSerial.flush(); digitalWriteFast(CS_PIN, LOW); SPIT.transfer(NULL, rxBuffer, BUFFER_SIZE, event); while (!event_happened) ; event_happened = false; dumpBuffer(rxBuffer, 512); validateTXBuffer(0); delay(5); DBGSerial.println("Tests completed"); SPIT.endTransaction(); } void dumpBuffer(uint8_t *pb, int cb) { uint8_t i = 0; while (cb) { DBGSerial.print(*pb++, HEX); cb--; DBGSerial.print(" "); i++; if (i == 16) { DBGSerial.println(); i = 0; } } DBGSerial.println(); } void validateTXBuffer(uint8_t test) { uint8_t error_count = 0; for (int i = 0; i < BUFFER_SIZE; i++) { if (((test == 0) && (buffer[i] != (i & 0xff))) || ((test == 1) && (buffer[i] != (i / 1024)))) { DBGSerial.print("Tx Buffer validate failed Index: "); DBGSerial.print(i, DEC); DBGSerial.print(" Value: "); DBGSerial.println(buffer[i], HEX); error_count++; DBGSerial.print("Tx Buffer validate failed Index: "); DBGSerial.print(i, DEC); if (error_count == 10) break; } } }
see WMXZ RTC stuff https://forum.pjrc.com/threads/54711...l=1#post195387
(1062 build needs defintion for __rtc_localtime)
@KurtE
Ok. Made one more change to pins in your spi class:
Now I get on the sermon:Code:const SPIClass::SPI_Hardware_t SPIClass::spiclass_lpspi3_hardware = { CCM_CCGR1, CCM_CCGR1_LPSPI3(CCM_CCGR_ON), DMAMUX_SOURCE_LPSPI3_TX, DMAMUX_SOURCE_LPSPI3_RX, _spi_dma_rxISR1, 1, 7 | 0x10, 26, 2 | 0x10, 27, 2 | 0x10, 0, 7 | 0x10, IOMUXC_LPSPI3_SCK_SELECT_INPUT, IOMUXC_LPSPI3_SDI_SELECT_INPUT, IOMUXC_LPSPI3_SDO_SELECT_INPUT, IOMUXC_LPSPI3_PCS0_SELECT_INPUT, 1, 0, 1, 0 };
So now let me go and check my connections to the display again. Always a problem.Code:ILI9488_t3n: (T4) SPI1 automatically selected MOSI:26 MISO:1 SCK:27 ILI9488 Test! Display Power Mode: 0x0 MADCTL Mode: 0x0 Pixel Format: 0x0 Image Format: 0x0 Self Diagnostic: 0x0 Benchmark Time (microseconds) Screen fill 734227 Text 14712 Lines 189020 Horiz/Vert Lines 62006 Rectangles (outline) 34462 Rectangles (filled) 1774692 Circles (filled) 220661 Circles (outline) 152997 Triangles (outline) 40923 Triangles (filled) 559241 Rounded rects (outline) 67348 Rounded rects (filled) 1947741 Done!
EDIT: Rechecked the wiring - had to switch a few but still no display. Ok more digging I guess.
EDIT:2 - double checked SPI and that still works - just don't see why SPI1 is not working.
Last edited by mjs513; 04-26-2019 at 12:26 AM.
And if you want to buy in small quantities: https://www.digikey.com/product-deta...4-1-ND/1003250. More concerned with the dimensions than the order quantity. Usually digikey gives you a choice.
@KurtE
Looks like SPI1 works with the ILI9488 library. You have to use CS0 on pin 0 to make it work - doesn't work with CS=10. Also you need the changes to SPI library for spiclass_lpspi3_hardware in post #2490.
@mjs513 What does your table look like now?
I think I was getting some luck with:
Some reason when I tried 1, 0, 1, 0, I was not getting output, but maybe my trying to press probes at the bottom of the chip to touch those pins... I was not making good contact.Code:const SPIClass::SPI_Hardware_t SPIClass::spiclass_lpspi3_hardware = { CCM_CCGR1, CCM_CCGR1_LPSPI3(CCM_CCGR_ON), DMAMUX_SOURCE_LPSPI3_TX, DMAMUX_SOURCE_LPSPI3_RX, _spi_dma_rxISR1, 1, 7 | 0x10, 26, 2 | 0x10, 27, 2 | 0x10, 0, 7 | 0x10, IOMUXC_LPSPI3_SCK_SELECT_INPUT, IOMUXC_LPSPI3_SDI_SELECT_INPUT, IOMUXC_LPSPI3_SDO_SELECT_INPUT, IOMUXC_LPSPI3_PCS0_SELECT_INPUT, 1, 0, 0, 0 };
Assuming you are getting good results you may want to do a PR to SPI library. And thanks
@KurtE
This is what I am using now
Like you said it was based on pages 842 on for LSPI3 pinsCode:const SPIClass::SPI_Hardware_t SPIClass::spiclass_lpspi3_hardware = { CCM_CCGR1, CCM_CCGR1_LPSPI3(CCM_CCGR_ON), DMAMUX_SOURCE_LPSPI3_TX, DMAMUX_SOURCE_LPSPI3_RX, _spi_dma_rxISR1, 1, 7 | 0x10, 26, 2 | 0x10, 27, 2 | 0x10, 0, 7 | 0x10, IOMUXC_LPSPI3_SCK_SELECT_INPUT, IOMUXC_LPSPI3_SDI_SELECT_INPUT, IOMUXC_LPSPI3_SDO_SELECT_INPUT, IOMUXC_LPSPI3_PCS0_SELECT_INPUT, 1, 0, 1, 0 };
FrankB - I wanted to say manitou started the RTC work - but the sketch I found was WMXZ - for wake alarm - but Manitou was about 200 posts earlier with RTC ... RTC ticking ... Here is a simple sketch to start up the RTC
That is good news on faster and working GPIO toggles - ~2 cpu cycles when there are 600,000,000 per second is … quick
What is power consumed when 'Off' - with RTC still ticking - Paul said that will be reduced in coming weeks when boot MCU goes offline.
Your 37.5°C temp agrees with what I was seeing when idle.
Very nice the SDIO BUILTIN_SDCARD is (better) able to see both cards. Funny my two here are Kinston and Sandisk - I can 'listfiles' on both.
ILI9341_t3
@KurtE
Tried your modified library with T4 on SPI1 it will not work on anything other than SPI. Looks like we will have to do the same thing we did for the ILI9488_t3 lib to get it working on other SPI ports. That may take a little more work - guess that is a new project
@Paul - know you have a ton of stuff on your list of things to do but do you think you can pull in Kurt's PR into the ILI9341 lib at some point so we have a baseline lib for the T4?
@KurtE
Sorry I just saw this - no problem doing the PR but should I do it to your fork or the Paul's master - get confused sometimesAssuming you are getting good results you may want to do a PR to SPI library. And thanks![]()
@KurtE / @mjs513 - let me know where the latest usable 9488 / 9341 / USBHost are and perhaps that can be next.
Other than the odd problem with Serial1 getting power from debug Teensy Tx ("The UART data transmission line is normally held at a high voltage level when it’s not transmitting data" - making the BB Green LED glow) and stopping it from booting [as it seemed the T4-1 did similarly 1+K posts back and first page issue] - everything looks happy good.
@KurtE - did you give the quick test suggested on your USB<>UART device that was causing your T4-2 to not startup? See the Glow when Off with common GND?
IIRC there is some rule about having power applied pins of an unpowered device? But something like this seems a common thing?
<edit>: When discovered on the T4-1 as noted in post #6: 'teensy_ports issues with 3+ boards, #1330, #1398 #2391 t4b2 one board LED Glows,'
That was with two added debug Teensy's - this happens with just 1 - perhaps the 1052 had better handling of this - I did test with a single Tx on Rx and T4-1 did not repro like on T4-2.
… as noted here #2391: No Start T4 with Serial Teensys on UARTUSB
Last edited by defragster; 04-26-2019 at 10:09 AM.
received the 1062-beta board -- thanks!
no boot-up issues when using external power! (see #1995)
quick question about "Drive Strength":
i've been playing around a bit with a SPI DAC breakout-board this morning and having difficulties getting it to run reliably. the SPI signals in that case have been giving me a bit of a headache before, so i'm not entirely surprised, but the DAC will run glitch-free for days using T3.2 @ 30MHz SPI SCK (in this case, the trick was to disable the DSE bit, ie CORE_PIN13_CONFIG = PORT_PCR_MUX(2)), so i figured it should at least run at modest speeds using T4.0 ... (not so, unfortunately, even at 1MHz the DAC will eventually trip up).
am i right in assuming that IOMUXC_PAD_DSE(1) would be the nearest equivalent as regards 1052/1062? (it does give slightly better results than IOMUXC_PAD_DSE(3)) (IOMUXC_PAD_DSE(0) = 000 / "DSE_0_output_driver_disabled" stops everything entirely), or is there anything else i can do/try to vamp up the signals? (ie save hardware modifications .. ))