SPI and QSPI

 


 

SPI = Serial Peripheral interface. It is very popular 4 wire interface, and is supported in many tiny chips because of it's simplicity.

SPI has a master and slave. 

Master drives these 3 pins:

  • CLK
  • MOSI (Dataout pin) along with 
  • CSn (Chip Select pin) to select slave. We can multiple of these and pull only one of them low to have that particular slave drive the MISO pin (see below)

Slave drives this 1 pin:

  • MISO (Datain pin)

Wikipedia article with basics: https://en.wikipedia.org/wiki/Serial_Peripheral_Interface

SPI timing diagram with waveform => spi_diagram.jpg

 


 

QSPI: Quad SPI

A very good tutorial here: https://embeddedinventor.com/quad-spi-everything-you-need-to-know/

 


 

Jinja:

Jinja is template making module in Python. It's a template engine or template processor. that takes a template and processes it to produce documents. We can specify various fields of template using variables, then substitute these var with different set of values when passed thru Jinja, resulting in document for 100's of different data. So, Jinja is basically a template to document converter tool.

A very good link for tutorial is here: https://zetcode.com/python/jinja/

Installation:

Just like other python modules, Jinja is not installed by default, and we have to install the Jinja module

We use the pip3 tool to install Jinja. Type below cmd on Terminal prompt.

$ sudo pip3 install jinja2

Basics:

I had seen Jinja being used in a lot of Verilog testcases, where you want to update a section of testcases based on some other text file, say signals.txt. You use Jinja to generate the testcase document based on a template that you write manually. We use signals.txt file as our data, and based on this data, the document is created from the template.

 

ElectroMagnetism:

Both Electric and Magnetic fields go hand in hand. Although them seem very different from each other, one can be generated from the other. They appear as Electric or magnetic field depending on the frame of reference of the observer. We first look at Electric field and then at Magentic field.

Electric field/force:

 This force is between charged particle at rest. Coulomb's Law for Electrostatic Force is exactly similar in form to Newton's Gravitational Force. It was published in 1785 by Charles Coulomb and is given by below formula

  1. Coulomb's Law: F=q1*q2/(4*Π*ε*R^2). It's similar to the formula for Newton's Gravitational law. Here instead of G, we replace it by other constant (1/4*Π*ε). q1 and q2 are 2 charges present, similar to masses m1 and m2 in Newton's Gravitational law.
  2. Electric Field is defined as field due to presence of charge q and is given as E = F/q2 = q/(4*Π*ε*R^2). Electric field is measured in V/m. ε is the permittivity of the material. It measures as to how well the material itself polarizes in response to the Electric Field. This happens due to natural tendency of outside charges to rearrange themselves so that the Field is reduced. If we put the charge Q in a vacuum, then there's nothing in vacuum to neutralize the field, so vacuum will have the lowest permittivity possible. For vacuum, permittivity is ε0 = 8.85*10^-12 F/m. Unit is F/m as ε=Q/E.1/R^2 = Cap.m/m^2=Cap/m=F/m.We take out the constant part (1/4*Π*ε) and call it the Coulomb Constant (ke) = 1/4*Π*ε0 = 9*10^9 N-m^2/C^2  where F =  ke*q1*q2/R^2. Thus it can be seen that force is lot stronger than gravitational force (as ke is very large number). 
  3. Relative Permittivity: Since everything has higher permittivity than vacuum, we talk in terms of relative permittivity εr which is the ratio of the absolute permittivity of medium to permittivity of vacuum. i.e εr= ε/ε0. A metal doesn't allow any Electric field to exist within itself, as any resultant Electric field will make electrons move (as electrons are very loosely bound), and they will keep moving until the Electric Field within the metal is no more there. So, if we put a charge surrounded by metal, metal will have no resultant Electric field, implying infinite ε. (NOTE: ε.appears in the denominator, implying higher ε.will reduce Electric field). Basically electrons will move to one end making that end -ve charged, while leaving the other end +ve charged. Thus a really big dipole is created in the metal which neutralizes the applied Electric field completely. For any material which is a perfect insulator, electrons can't freely roam whenever there's an Electric field. They are stuck in their positions bound to the nucleus. At an atomic level, the electron cloud in an atom might still get distorted. Electrons might get pushed away a little from the Electric Field creating a dipole. All such atomic dipoles will create an internal electric field in opposite direction to applied Electric field. How strong of the dipole is created is dependent on the material's ability to form such dipoles. Perfect Conductors may be thought of as an extreme case where such dipoles are created along the full length of the material, i.e electrons go on one side and nucleus goes to the opposite side. Polarizing insulators make limited length dipoles. Electrons are still held in place but just shifted a little. So, there is some net Electric field left. More the dipole electric field formed, less is the net electric field and higher is the permittivity of the material. Higher permittivity means you have to apply more charge to hold same potential difference, as some of the applied field will get neutralized. Permittivity is the capacitive ability of a material, and totally different than resistivity (see in Passive elements section). Silicon has εr=12, while SiOhas εr=4. This means Si will have less Electric field and hence higher ability to retain charge for same Voltage than SiO2. Capacitors have materials known as dielectric with high εr so that they can hold more charge and hence more energy per unit of applied voltage.

 

Magnetic field/force:

This force is counterpart of Electric force. It's caused by magnetic charges instead of electric charges. The only thing unique to magnetic charges is that they always appear in pair, i.e +ve and -ve magnetic charges will appear together, and can never be separated. Usually Magnetic force or magnetic field is associated with magnets, but anything else can also behave as a magnet under right conditions. A magnet's North and South pole can be thought of as 2 magnetic charges, one at N and other at S, with opposite polarity. A moving electric charge behaves as a magnetic charge and causes magnetic field. Thus a stationary charge generates an electric field, while moving charge generates a magnetic field. However, moving is a relative term, and depends on the frame of reference of the observer. To 2 different observers in different frame of reference, the same charge can appear as moving or stationary, causing one to believe that the charge has an electric field, while to the other to believe that the charge has a magnetic field.

The equation for Magnetic field are slightly complicated, due to the fact that magnetic charges exist only in pairs. If we really had magnetic charges that could exist by themselves, then Magnetic forces would be similar to Coulomb's law. Infact, in was referred to as "Magnetic Coulombs Law".

F=qm1*qm2/(4*Π*(1/μ)*R^2). It's similar to the formula for Coulomb's law for electric charges, except that the 2 electric charges have been replaced by magnetic charges, and permittivity  ε.has been replaced by 1/μ, where μ is the permeability of the medium.

Until 1800's, this theory of magnetic charges was held. All work in early 1800's believed in the theory of magnetic dipoles (i.e magnetic charges exist in pair, creating a dipole). These dipoles gave rise to electric field. But in 1820's, it was found that magnetic field is not generated due to magnetic charges, but rather due to current, which is generated by moving electrical charges. In 1825 Andre Ampere proposed that magnetism is due to perpetually flowing loops of current instead of the dipoles of magnetic charge in Poisson's mode.

Then how do magnets generate Magnetic field, since they don't have any current thru them?

Electomagnetism:

Maxwell's Equations.

 

Wave Equation:

Derivation of Wave equation (Electromagetic field) from Maxwell's equations:

Very good paper here: Wave Equation derivation

 

 

sed:

streamline editor for noninteractive purpose. This is a linux pgm that was used in older days to manipulate files. Now a days, perl and other scripts can do the job just as easily. sed allows us to do same editing as from within vi, but allows us to do it  from cmd line by providing editing cmd and name of file. It's very easy to use, and should be your first choice whenever you want to search, replace for patterns in your file. Other scripting languages require quite a bit of code to many any manipulations to a file (i.e you have to open a file, copy lines one by one to other file, after modifying lines of interest, and then close all the files. Most scripting languages don't allow editing the same file content, while sed allows you to do that). So, 10 lines of code in some other language may require just 1 line of code in sed. sed has very easy syntax (you just need to regular expression), and very few cmds to get 99% of work done.

A very good reference is here: https://www.grymoire.com/Unix/Sed.html

You can also include sed cmds in any other script, as though they were native unix cmds (as sed is installed by default on all Linux distro). So, you can think of sed as ls, cp, etc which does file editing for you.

NOTE: There are 2 variants of sed: BSD sed and GNU sed. BSD sed is the original one, but it has lot of idiosyncrasies. You should always use the gnu sed version, and that's what's installed on most Linux distro. Most of the cmds you find online are assuming GNU sed (also called as gsed). Type "sed --version" on terminal to check sed version.

Terminal prompt$ sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.

syntax:

sed <options> 'command' filename => command tells sed what to do with lines in file, change it, remove it, etc. There are many optional options that can be provided which have to be preceeded by -. The command itself may be put in single quotes, or in double quotes (see under variable substitution to see when should double quotes be used).

ex: sed -i '/_slash/d' ~/tmp.txt => Here -i is the option, '...' is the cmd, and we are using this cmd on file tmp.txt

options:

Sed cmds are provided on terminal and it prints modified o/p on screen. If we want the modified o/p to be saved in a file, we can redirect sed o/p to another file (by usng linux > operator). There are various options to change the default behaviour.

  • -i => If we want to modify the original file,  we have to use -i (inplace) option. NOTE: -i is not for "case insensitive". sed doesn't have an option to be called with case insensitive option (BSD sed may have a -I option for case insensitivity applied globally, but it doesn't work on gnu sed).
  • -r => sed by default uses BRE (Basic RE, see in Regular Expression section), but using -r makes it use ERE (ERE is recommended). 
  • -e => To specify multiple sed cmds

command:

command follows the usual syntax: i.e 'flag1/<original_pattern>/<modified_pattern>/flag2' => This is similar to pattern replacement syntax that you see in Perl, Python, etc. "flags" in beginning or end specify what we want to do with the pattern. d=delete (used in flag2), s=substitute (used in flag1), etc. More details later.

deleting patterns: We use '/<pattern>/d' to delete matched pattern

sed -i -r '/_slash/d' ~/tmp.txt => delete _slash from tmp.txt (-i means same file tmp.txt is modified. -r means use extended regular expression (ERE)).

delete blank lines: sed '/^$/d' in.txt > out.txt => all lines in file in.txt that start and end with nothing in b/w are deleted, and o/p is passed on to new file out.txt

substituting pattern: We use 's/<orig_pattern>/<new_pattern>/' to substituting matched pattern

sed -r "s/'/ /g" in.txt > out.txt =>Here we are replacing ' with space. So, we had to use double quotes, since using single quotes gave an error => unmatched '. g is used to say do it globally.

sed -e 's/.*/PRE: & SUF \\/g' in.txt > out.txt =>Here in every line, we are replacing he start and end of line with "PRE:" and "SUF \" respectively. We have to use double backslash, since single backslash is itself an escape char. If we don't use \\, and instead use \, then / following \ is treated as literal, so we get "unterminated cmd" error.


sed -r 's/\$\{.*slash\}//g'   ~/tmp${num}.txt > out.txt => here we globally replace ${.....slash} with nothing, i.e remove that pattern. Here instead of doing inline replacement, we pass on the results to another file named out.txt

Remembering matching patterns: This is done by enclosing the pattern to be rembered using () and then recalling it back using \1, \2 etc where \1 is the 1st pattern within (), \2 is the second pattern and so on.

sed -r 's/(.*)\s+(.*)/\2 -SPACE \1/g' ~/orig.txt > ~/mod.txt => Here we are replacing all lines which have patterns of form " aa/a?aa  bbb/ccc" with "bbb/ccc -SPACE aa/a?aa". NOTE: we didn't use \(.*\) since we are using ERE (by using -r) where "(", ")" is recognized as special char. If we were using BRE, then we needed to use \(.*\)

Substituting with a variable: So far, we used single quotes in cmd section. We said that single and double quotes don't matter in the cmd section of sed. We use one over the other depending on whether the cmd itself contains single or double quotes. i.e  double quotes is used if you need to use a single quote in command itself. One other place double quotes is used is when you need to substitute the value of a var in the sed cmd. It behaves just like other scripting languages, where one kind of quote allows "var substitution" while other kind doesn't.

ex: set a ="my lord"; sed -i "s/abc.*$/ME $a/" z.log => HereAnything with "abc" until the end of line is subtituted with char "ME my lord". If we used single quotes, then "ME $a" will get substituted.

Print or delete between specific Markers: This is very used cmd when we have markers in a file and we want to cut out that protion of file, and replace it with something else. This is mostly used when some automated section of a file is updated via scripts, and we want the rest of the file untouched.

ex: sed -e '/START_MARKER/,/END_MARKER/d' File1 => d flag says to delete lines (p flag is to print lines, but doesn't work - FIXME) b/w the 2 markers: START_MARKER and END_MARKER. If END_MARKER is some pattern which is not there in the file, then everything from START_MARKER to the EOF is deleted. Use some marker as ZZZZ which is not there in file, and then contents from START_MARKER to the EOF is deleted.

Substitute text between specific Markers with contents from another file: This is not easy, as I tried several 1 liners on internet and nothing worked. The only code that works is below and it ONLY works in Bash shell. It'll error out in csh as it needs 2 lines for sed cmd to work (which apparently breaks in csh):

Link: https://superuser.com/questions/440013/how-to-replace-part-of-a-text-file-between-markers-with-another-text-file

Here, original file is edited. It has contents b/w "START of Pattern' and "END of Pattern" that are replaced by contents of replacement_file. NOTE the 2nd line on sed cmd. You have to put that code in 2nd line (i.e after a newline), else it won't work !!

lead='START of Pattern'
tail='END of Pattern'
sed -i "/$lead/,/$tail/{ /$lead/{p; r replacement_file.txt
  }; /$tail/p; d }"  original_file.txt