Work done
This commit is contained in:
		
							parent
							
								
									56f9296581
								
							
						
					
					
						commit
						dd31ffadfb
					
				| @ -13,8 +13,6 @@ documentation = "https://docs.embassy.dev/cyw43-pio" | ||||
| # If disabled, SPI runs at 31.25MHz | ||||
| # If enabled, SPI runs at 62.5MHz, which is 25% higher than 50Mhz which is the maximum according to the CYW43439 datasheet. | ||||
| overclock = [] | ||||
| # If enabled the PIO runs at a speed that works with the rm2 module | ||||
| rm2 = [] | ||||
| 
 | ||||
| [dependencies] | ||||
| cyw43 = { version = "0.2.0", path = "../cyw43" } | ||||
|  | ||||
| @ -10,6 +10,7 @@ use embassy_rp::dma::Channel; | ||||
| use embassy_rp::gpio::{Drive, Level, Output, Pull, SlewRate}; | ||||
| use embassy_rp::pio::{instr, Common, Config, Direction, Instance, Irq, PioPin, ShiftDirection, StateMachine}; | ||||
| use embassy_rp::{Peripheral, PeripheralRef}; | ||||
| use fixed::types::extra::U8; | ||||
| use fixed::FixedU32; | ||||
| use pio_proc::pio_asm; | ||||
| 
 | ||||
| @ -22,6 +23,26 @@ pub struct PioSpi<'d, PIO: Instance, const SM: usize, DMA> { | ||||
|     wrap_target: u8, | ||||
| } | ||||
| 
 | ||||
| /// The default clock divider that works for Pico 1 and 2 W. As well as the RM2 on rp2040 devices.
 | ||||
| /// same speed as pico-sdk, 62.5Mhz
 | ||||
| /// This is actually the fastest we can go without overclocking.
 | ||||
| /// According to data sheet, the theoretical maximum is 100Mhz Pio => 50Mhz SPI Freq.
 | ||||
| /// However, the PIO uses a fractional divider, which works by introducing jitter when
 | ||||
| /// the divider is not an integer. It does some clocks at 125mhz and others at 62.5mhz
 | ||||
| /// so that it averages out to the desired frequency of 100mhz. The 125mhz clock cycles
 | ||||
| /// violate the maximum from the data sheet.
 | ||||
| pub const DEFAULT_CLOCK_DIVIDER: FixedU32<U8> = FixedU32::from_bits(0x0200); | ||||
| 
 | ||||
| /// The overclock clock divider for the Pico 1 W. Does not work on any known RM2 devices.
 | ||||
| /// 125mhz Pio => 62.5Mhz SPI Freq. 25% higher than theoretical maximum according to
 | ||||
| /// data sheet, but seems to work fine.
 | ||||
| pub const OVERCLOCK_CLOCK_DIVIDER: FixedU32<U8> = FixedU32::from_bits(0x0100); | ||||
| 
 | ||||
| /// The clock divider for the RM2 module. Found to be needed for the Pimoroni Pico Plus 2 W,
 | ||||
| /// Pico Plus 2 Non w with the RM2 breakout module, and the Pico 2 with the RM2 breakout module.
 | ||||
| /// Does not work with the feature "overclock".
 | ||||
| pub const RM2_CLOCK_DIVIDER: FixedU32<U8> = FixedU32::from_bits(0x0300); | ||||
| 
 | ||||
| impl<'d, PIO, const SM: usize, DMA> PioSpi<'d, PIO, SM, DMA> | ||||
| where | ||||
|     DMA: Channel, | ||||
| @ -31,6 +52,7 @@ where | ||||
|     pub fn new<DIO, CLK>( | ||||
|         common: &mut Common<'d, PIO>, | ||||
|         mut sm: StateMachine<'d, PIO, SM>, | ||||
|         clock_divider: FixedU32<U8>, | ||||
|         irq: Irq<'d, PIO, 0>, | ||||
|         cs: Output<'d>, | ||||
|         dio: DIO, | ||||
| @ -112,31 +134,7 @@ where | ||||
|         cfg.shift_in.direction = ShiftDirection::Left; | ||||
|         cfg.shift_in.auto_fill = true; | ||||
|         //cfg.shift_in.threshold = 32;
 | ||||
| 
 | ||||
|         #[cfg(feature = "overclock")] | ||||
|         { | ||||
|             // 125mhz Pio => 62.5Mhz SPI Freq. 25% higher than theoretical maximum according to
 | ||||
|             // data sheet, but seems to work fine.
 | ||||
|             cfg.clock_divider = FixedU32::from_bits(0x0100); | ||||
|         } | ||||
| 
 | ||||
|         #[cfg(not(any(feature = "overclock", feature = "rm2")))] | ||||
|         { | ||||
|             // same speed as pico-sdk, 62.5Mhz
 | ||||
|             // This is actually the fastest we can go without overclocking.
 | ||||
|             // According to data sheet, the theoretical maximum is 100Mhz Pio => 50Mhz SPI Freq.
 | ||||
|             // However, the PIO uses a fractional divider, which works by introducing jitter when
 | ||||
|             // the divider is not an integer. It does some clocks at 125mhz and others at 62.5mhz
 | ||||
|             // so that it averages out to the desired frequency of 100mhz. The 125mhz clock cycles
 | ||||
|             // violate the maximum from the data sheet.
 | ||||
|             cfg.clock_divider = FixedU32::from_bits(0x0200); | ||||
|         } | ||||
| 
 | ||||
|         #[cfg(feature = "rm2")] | ||||
|         { | ||||
|             // This is found to work better with the RM2 module which is found on the Pimoroni Pico Plus 2 W
 | ||||
|             cfg.clock_divider = FixedU32::from_bits(0x0300); | ||||
|         } | ||||
|         cfg.clock_divider = clock_divider; | ||||
| 
 | ||||
|         sm.set_config(&cfg); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user