SPI
最高速度可以达到几十M, 甚至是全双工
有一个六轴传感器
可以连接多个外设, 有四根线, CS/SS片选信号, SCK时钟, MOSI/SDO主出从入, MISO主入从出
通过CS引脚拉低进行选择
引脚: 连接的是SPI3进行连接, UART2_ST_DATA=>SCLK, UART2_CTS=>MOSI, UART_TXD=>SS0, UART2_RTS=>MISO
6ULL一个主接口有四个硬件片选
四种模式:
①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
一般使用两个都为0的模式
6ULL的SPI接口, 叫做ECSPI, 支持全双工, 主从可以配置, 四个硬件片选, 可以使用软件片选
ICM-20608
六轴传感器, 三轴陀螺仪, 三轴加速度计
陀螺仪精度可以设置, 及速度分辨率可以设置, 陀螺仪和加速度计都是16位ADC, 可以使用I2C400K, SPI8M,
I2C地址默认为110100x, x由引脚控制
寄存器:
-
ICM20608G的0x75寄存器 WHO_AM_I寄存器, 只读寄存器, 保存了ID默认值为0xaf
-
0x3b-0x48为我们要读取的寄存器
读取的时候最少要有16个周期, 前八个发送寄存器地址, 后面的接收数据
在第七位数据决定读或者写
寄存器
ECSPIx_RXDATA
: 接收数据, 有32位但是一般使用低8位, 标志位为1的时候才可以读取
ECSPIx_TXDATA
: 发送数据寄存器, 32位, 会自发送
(ECSPIx_CONREG
: 配置寄存器, bit0使能SPI, bit3设置为1的时候在写入数据以后立即发送, 7-4硬件片选设置主从模式, 7为通道3, 我们是用SS0, 设置4为1, bit8-11分频设置2的n次方, bit12-15分频设置bit18-19设置为00通道选择, bit20-31突发访问长度设置为7也就是8bit长度
ECSPIx_CONFIGREG
: bit0-3 设置PHA为四个通道, 每个通道一位, bit4-7, 设置POL, 都设置为0, 表示这是SCLK空闲为低电平, 第一个跳变沿读取, bit8-11控制片选的输出设置为0, bit12-15片选极性, 设置为0, bit16-19设置数据线空闲电平, 设置为0, bit20-23空闲时钟0
ECSPIx_STATREG
: 状态寄存器, bit0等待发送完成为1, bit3接收, 有的时候为1, 在接收数据的时候等待为1,
ECSPIx_PERIODREG
: bit0-14等待状态时间长度, 两个传递数据之间, 设置为2000, bit15设置单位设置为0为时钟周期, bit16-21片选信号延时不需要使用
时钟设置
spi
时钟源最终来源于pll3_sw_clk
这是一个480/8MHz是一个60MHz, 也可以设置为晶振(CCM_CSCDR2[ECSPI_CLK_SEL])bit18设置为0, bit19-24分频设置为0, 一分频, 最终为60Mhz
ECSPIx_CONREG
再次设置分频,
浮点
在使用浮点运算的时候会卡死, 应为没有使用硬件浮点, 并且没有在编译的时候加入浮点
①开启浮点
②编译时候开启 -march=armv7-a -mfpu=neon-vfpv4-mfloat-abi=hard
$(CC) -Wall -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
所有的A7\内核打开浮点数
void imx6ul_hardfpu_enable(void)
{
uint32_t cpacr;
uint32_t fpexc;
/* 使能NEON和FPU */
cpacr = __get_CPACR();
cpacr = (cpacr & ~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))
| (3UL << CPACR_cp10_Pos) | (3UL << CPACR_cp11_Pos);
__set_CPACR(cpacr);
fpexc = __get_FPEXC();
fpexc |= 0x40000000UL;
__set_FPEXC(fpexc);
}