Skip to content
Snippets Groups Projects
Commit 45031c51 authored by Tmplt's avatar Tmplt
Browse files

feat(examples): add CAN transmit example

parent 2795379a
Branches
No related tags found
No related merge requests found
......@@ -48,6 +48,7 @@ dependencies = [
"cortex-m 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
"cortex-m-rt 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
"panic-halt 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"s32k144 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
......@@ -105,6 +106,16 @@ dependencies = [
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "s32k144"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bare-metal 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cortex-m 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
"vcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "semver"
version = "0.9.0"
......@@ -160,6 +171,7 @@ dependencies = [
"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372"
"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
"checksum s32k144 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ac15467169f28939784b086dcd4ecd5093a36d0fa180d71df30361badb359bd"
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9545a6a093a3f0bd59adb472700acc08cad3776f860f16a897dfce8c88721cbc"
......
......@@ -8,3 +8,4 @@ edition = "2018"
cortex-m = "0.5.0"
panic-halt = "0.2.0"
cortex-m-rt = "0.6.3"
s32k144 = "0.10.0"
//! An (almost) direct C-to-Rust rewrite of the S32K144 FlexCAN example from NXP's S32 SDK. Sets up
//! communication over CAN0 and continuously transmits messages. Sends CAN frames with a speed of
//! 500 kbit/s, SJW = 4, Tseg1 = 11, Tseg2 = 4.
//!
//! Differences from C example:
//! * CAN freeze mode is seemingly not entered correctly.
//! * no buffer/filtering clearing/initialization (see commented block); freeze mode required.
//!
//! Only used for testing/development purposes.
#![no_main]
#![no_std]
extern crate cortex_m_rt;
extern crate s32k144;
extern crate panic_halt;
use cortex_m_rt::entry;
#[entry]
unsafe fn main() -> ! {
let p = s32k144::Peripherals::take().unwrap();
// Disable watchdog
p.WDOG.cnt.write(|w| w.bits(0xd928c520)); // unlock
p.WDOG.toval.write(|w| w.bits(0xffff)); // maximum timeout value
p.WDOG.cs.write(|w| w.bits(0x2100)); // disable watchdod
// SOSC_init_8Mhz
p.SCG.soscdiv.write(|w| w.bits(0x101));
p.SCG.sosccfg.write(|w| w.bits(0x24));
while p.SCG.sosccsr.read().lk().is_1() {} // Ensure SOSCCSR unlocked
p.SCG.sosccsr.write(|w| w.bits(0x1));
while p.SCG.sosccsr.read().soscvld().is_1() {}
// SPLL_init_160Mhz
while p.SCG.spllcsr.read().lk().is_1() {}
p.SCG.spllcsr.write(|w| w.bits(0x0));
p.SCG.splldiv.write(|w| w.bits(0x302));
p.SCG.spllcfg.write(|w| w.bits(0x180000));
while p.SCG.spllcsr.read().lk().is_1() {}
p.SCG.spllcsr.write(|w| w.bits(0x1));
while p.SCG.spllcsr.read().spllvld().is_1() {}
// NormalRUNmode_80Mhz
p.SCG.rccr.modify(|_, w| {
w.scs().bits(6)
.divcore().bits(0b01)
.divbus().bits(0b01)
.divslow().bits(0b10)
});
while p.SCG.csr.read().scs().bits() != 6 {} // wait while clock is changed
// FLEXCAN0_init
p.PCC.pcc_flex_can0.modify(|_, w| w.cgc()._1());
p.CAN0.mcr.modify(|_, w| w.mdis()._1());
p.CAN0.ctrl1.modify(|_, w| w.clksrc()._0());
p.CAN0.mcr.modify(|_, w| {
w.mdis()._0()
.frz()._1()
.halt()._1()
});
while p.CAN0.mcr.read().frzack().is_1() {}
p.CAN0.ctrl1.write(|w| w.bits(0xdb0006));
// for i in 0..128 {
// p.CAN0.embedded_ram[i].write(|w| w.bits(0));
// }
// for i in 0..16 {
// p.CAN0.rximr[i].write(|w| w.bits(0xffffffff));
// }
p.CAN0.rxmgmask.write(|w| w.bits(0x1fffffff));
p.CAN0.embedded_ram[4 * 4].modify(|_, w| {
w.bits(0x4000000)
});
p.CAN0.embedded_ram[4 * 4 + 1].modify(|_, w| {
w.bits(0x14440000)
});
p.CAN0.mcr.write(|w| w.bits(0x1f));
while p.CAN0.mcr.read().frzack().is_1() {}
while !p.CAN0.mcr.read().notrdy().is_0() {}
// PORT_init
p.PCC.pcc_porte.modify(|_, w| w.cgc()._1());
p.PORTE.pcr4.modify(|_, w| w.mux()._101());
p.PORTE.pcr5.modify(|_, w| w.mux()._101());
p.PCC.pcc_portd.modify(|_, w| w.cgc()._1());
p.PORTD.pcr16.write(|w| w.bits(0x100));
p.PTD.pddr.modify(|_, w| w.bits(1 << 16));
// just transmit messages in a loop down here
loop {
// FLEXCAN0_transmit_msg
p.CAN0.iflag1.write(|w| w.bits(0x1));
p.CAN0.embedded_ram[2].write(|w| w.bits(0xa5112233));
p.CAN0.embedded_ram[3].write(|w| w.bits(0x44556677));
p.CAN0.embedded_ram[1].write(|w| w.bits(0x15540000));
p.CAN0.embedded_ram[0].write(|w| w.bits(0xc400000 | (8 << 16)));
}
}
......@@ -8,7 +8,7 @@ let
src = fetchurl {
url = "https://www.segger.com/downloads/jlink/JLink_Linux_x86_64.deb";
sha256 = "0d0hs5bcff2il0i44hg2d7cs33p1kr8zqclpmi2a5p7cwbnaqmc8";
sha256 = "0l70v6hhj357hkhxyiayc29z544x21kaaphxlj5jx170jyc590bj";
curlOpts = "-d accept_license_agreement=accepted -d confirm=yes";
};
......@@ -31,7 +31,7 @@ let
# TODO: package all binaries in jlink
gdbServer = buildFHSUserEnv rec {
name = "JLinkGDBServerCLExe";
runScript = "${jlink}/opt/SEGGER/JLink_V640b/JLinkGDBServerCLExe";
runScript = "${jlink}/opt/SEGGER/JLink_V6*/JLinkGDBServerCLExe";
targetPkgs = pkgs: with pkgs; [
udev
......@@ -40,7 +40,7 @@ let
rttClient = buildFHSUserEnv rec {
name = "JLinkRTTClientExe";
runScript = "${jlink}/opt/SEGGER/JLink_V640b/JLinkRTTClientExe";
runScript = "${jlink}/opt/SEGGER/JLink_V6*/JLinkRTTClientExe";
targetPkgs = pkgs: with pkgs; [
udev
......@@ -49,7 +49,7 @@ let
JLinkExe = buildFHSUserEnv rec {
name = "JLinkExe";
runScript = "${jlink}/opt/SEGGER/JLink_V640b/JLinkExe";
runScript = "${jlink}/opt/SEGGER/JLink_V64*/JLinkExe";
targetPkgs = pkgs: with pkgs; [
udev
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment