Skip to content

Instantly share code, notes, and snippets.

@circuit4u-medium
Created November 23, 2020 16:48
Show Gist options
  • Save circuit4u-medium/5c55c42a2be347a752683eb77070849e to your computer and use it in GitHub Desktop.
Save circuit4u-medium/5c55c42a2be347a752683eb77070849e to your computer and use it in GitHub Desktop.
FT232H with IS31FL3731
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import libftd2xx"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
":dep libftd2xx"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"use libftd2xx::{Ftdi, FtdiCommon, BitMode};\n",
"use std::time::Duration;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Connect FTDI FT223H device"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Device information: DeviceInfo { port_open: true, speed: None, device_type: FT232H, vendor_id: 0x0403, product_id: 0x6014, serial_number: FTU85S8E, description: UM232H }\n"
]
}
],
"source": [
"let mut ft = Ftdi::new()?;\n",
"//let mut ft = Ftdi::with_serial_number(\"MLTS91A\")?; //use serial #\n",
"let info = ft.device_info()?;\n",
"println!(\"Device information: {:?}\", info);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **defered**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ft.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Define I2C functions"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"const SCK:u8 = 0x01u8; //AD0 of FT232H\n",
"const SDO:u8 = 0x02u8; //AD1 of FT232H\n",
"\n",
"pub trait I2C: FtdiCommon {\n",
" fn init_i2c(&mut self){\n",
" self.set_bit_mode(0, BitMode::Reset);\n",
" self.set_bit_mode(0, BitMode::Mpsse);\n",
" self.write(&[0x8A, 0x8C, 0x86,200,0]); //60MHz; 3-phase clock; set div=200 for 100k I2C clk rate \n",
" self.write(&[0x80,SCK+SDO,SCK+SDO]);//set both output high\n",
" }\n",
" \n",
" fn start_i2c(&mut self){ \n",
" self.write(&[0x80,SCK+SDO,SCK+SDO]);//set both output high\n",
" self.write(&[0x80,SCK,SCK+SDO]); //SDA falling edge\n",
" self.write(&[0x80,0,SCK+SDO]); //drop SCK as well\n",
" }\n",
" \n",
" fn stop_i2c(&mut self){ \n",
" self.write(&[0x80,0,SCK+SDO]); //set both output low\n",
" self.write(&[0x80,SCK,SCK+SDO]); //SCK high first\n",
" self.write(&[0x80,SCK+SDO,SCK+SDO]); //SDA rising edge\n",
" self.write(&[0x80,0,0]); //set both input; release bus\n",
" }\n",
" \n",
" \n",
" fn send_byte(&mut self, byte_to_send: u8) -> bool { \n",
" self.write(&[0x11u8, 0,0, byte_to_send,0x80,0,SCK,0x22,0,0x87]); //-ve byte out \n",
" let mut buf:[u8;1] = [0;1];\n",
" self.read(&mut buf);\n",
" self.write(&vec![0x80,SDO, SDO+SCK]);\n",
" println!(\"ACK_BIT={}\",buf[0]&1u8);\n",
" if buf[0] & 1u8 != 0u8{\n",
" return false\n",
" }else{\n",
" return true\n",
" }\n",
" }\n",
" fn set_reg(&mut self, reg:u8, payload:u8){\n",
" self.start_i2c();\n",
" self.send_byte(0xe8);\n",
" self.send_byte(reg);\n",
" self.send_byte(payload);\n",
" self.stop_i2c();\n",
"\n",
" }\n",
"}\n",
"\n",
"impl I2C for Ftdi {}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Let's explore IS31FL371"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP0: Initial I2C"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.init_i2c()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP1: Get to the right address"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Adafruit IS31FL3731 write I2C address = 0xE8"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.start_i2c();ft.send_byte(0xe8);ft.stop_i2c()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The device should ACK zero to the correct I2C write address."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP2: Turn ON/OFF"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. point to function register page"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD, 0x0B)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. turn on (Table 17 page14)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.set_reg(0x0a,0x01);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. turn off"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.set_reg(0x0a,0x00);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Depnding on the default register settings, you may already see a random number of LEDs light up by entering the normal mode."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP3: Setup a frame"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. point to Page One/Frame 1"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD, 0x00)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. clear "
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.start_i2c();\n",
"ft.send_byte(0xe8); //write address\n",
"ft.send_byte(0x00);\n",
"for i in 0..18 {\n",
" ft.send_byte(0x00);\n",
"}\n",
"ft.stop_i2c();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. set first row ON (Table 7 page 11)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0xff)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP4: Enter Picture Mode"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. point to Page Nine"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD, 0x0b)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. enter picture mode (Table 9 page 12)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x01,0x00)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. turn on"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x0a, 0x01)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP5: Adjust PWM"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. point to Frame 1"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD, 0x00)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. set PWM (Table 6 page 10)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.start_i2c();\n",
"ft.send_byte(0xe8);\n",
"ft.send_byte(0x24);\n",
"for i in 0..16 { //only for the first row\n",
" ft.send_byte(0x10); //set 8-bit PWM\n",
"}\n",
"ft.stop_i2c();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP6: Blink LED"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. enable blink control (Table 12 page 13)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.set_reg(0xFD, 0x0b);ft.set_reg(0x05, 0x0b);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. set page 1 blink bits (Table 5 page 10)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD, 0x00)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x12,0x0f);ft.set_reg(0x13,0xf0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**This blinking funtionn can quickly tell you the bit order.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP7: breathing funtion (doesn't seem to work in picture mode; wait till auto play mode)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"ft.set_reg(0xfd, 0x0b);"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x08, 0x77);ft.set_reg(0x09, 0x17)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## STEP8: simple animation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's make an effect of LEDs light up from left to right"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. clean up registers from 8 frames"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for i in (0..8){\n",
" ft.set_reg(0xFD, i);\n",
" //clear first\n",
" ft.start_i2c();\n",
" ft.send_byte(0xe8); //write address\n",
" ft.send_byte(0x00);\n",
" for i in 0..18 {\n",
" ft.send_byte(0x00);\n",
" }\n",
" ft.stop_i2c();\n",
" //set PWM\n",
" ft.start_i2c();\n",
" ft.send_byte(0xe8);\n",
" ft.send_byte(0x24);\n",
" for i in 0..16 { //only for the first row\n",
" ft.send_byte(0x10); //set 8-bit PWM\n",
" }\n",
" ft.stop_i2c(); \n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. setup 8 frames"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
}
],
"source": [
"//set 8 frames\n",
"ft.set_reg(0xFD, 0);\n",
"ft.set_reg(0x00,0x03);ft.set_reg(0x01,0x00);\n",
"ft.set_reg(0xFD, 1);\n",
"ft.set_reg(0x00,0x07);ft.set_reg(0x01,0x00);\n",
"ft.set_reg(0xFD, 2);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x00);\n",
"ft.set_reg(0xFD, 3);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x01);\n",
"ft.set_reg(0xFD, 4);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x07);\n",
"ft.set_reg(0xFD, 5);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x3f);\n",
"ft.set_reg(0xFD, 6);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0x7f);\n",
"ft.set_reg(0xFD, 7);\n",
"ft.set_reg(0x00,0xff);ft.set_reg(0x01,0xff);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. auto frame play mode"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0xFD,0x0b)"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x02, 0x00);ft.set_reg(0x00,0x08);ft.set_reg(0x03,12)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4. add breathing effect"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x08, 0x07);ft.set_reg(0x09, 0x10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5. disable breathing"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ACK_BIT=0\n",
"ACK_BIT=0\n",
"ACK_BIT=0\n"
]
},
{
"data": {
"text/plain": [
"()"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ft.set_reg(0x09,0x00)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"@webio": {
"lastCommId": null,
"lastKernelId": null
},
"kernelspec": {
"display_name": "Rust",
"language": "rust",
"name": "rust"
},
"language_info": {
"codemirror_mode": "rust",
"file_extension": ".rs",
"mimetype": "text/rust",
"name": "Rust",
"pygment_lexer": "rust",
"version": ""
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment