笔记与问题2
Question:1、 有没有例程如何操作寄存器完成I2C发送(接收)地址、数据。2、 有没有例程如何操作寄存器来校准时钟。3、 据了解在稍微复杂一点的项目尽量不要使用延迟,那么请问有没有定时器cha定时查询状态判断按键按下的例程一、 charconst *x 定义一个指向字符常量的指针x 。二、 if(a) b;c; //b语句在if语句里,c不在。三、 SPI通讯 : 占用3+(n)引脚(1个可不用(接地),2个以上占n个脚):⒈ MISO:主设备输入,从设备输出⒉ MISI:主设备输出,从设备输入⒊ SCK:时钟(主产生) ⒋ NSS:片选,从机被主机拉低电平后传输(从模式可用软件节省引脚,一般不用需要用时再了解)发送模式:例如主移位寄存器是01,从是02,发送完后将互换,如果主机不需要从机数据忽略即可。CPHA位可选4种模式,具体看56讲主模式配置步骤:1. 通过SPI_CR1寄存器的BR位定义串行时钟波特率。2. 选择CPOL和CPHA 位,定义数据传输和串行时钟间的相位关系。3. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。4. 硬件模式下,在数据帧的全部传输过程中应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR2寄存器的SSM和SSI位为‘1’。5. 必须设置MSTR(SPI主模式)和SPE位(SPI使能位)(只当NSS脚被连到高电平,这些位才能保持为‘1’)。在这个配置中,MOSI脚是数据输出,而MISO脚是数据输入。
参考正点原子的寄存器开发例程 子曰好人 发表于 2018-8-9 08:38
参考正点原子的寄存器开发例程
刚刚搜索了下,是STM32的例程,我正学习的是STM8S的 wrdt24435 发表于 2018-8-9 09:38
刚刚搜索了下,是STM32的例程,我正学习的是STM8S的
好吧,我不太了解stm8的资料,论坛或者网上搜索一下吧 本帖最后由 sincomaster 于 2018-8-17 17:56 编辑
这是我的硬件IIC,我是用寄存器操作的,可以看下,已可以点亮OLED了,
/*******************************************************************************
文件名称: I2C文件
函数功能: I2C Driver Code
软件平台: STVD4.3.12
编写日期: 2017.09.06
代码作者: sinco.170
备注事项: PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)
*******************************************************************************/
#include "stm8s.h"
#include "iostm8s.h"
#include "iic.h"
//http://bbs.mydigit.cn/read.php?tid=2482933
//http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/
//http://www.openedv.com/thread-70958-1-1.html
//http://blog.csdn.net/DevinTT/article/details/74854851
/*******************************************************************************
函数名称: void IIC_Init(void)
函数功能: I2C初始化
输入参数: null
输出参数: null
编写日期: 2017.09.06
代码作者: sinco.170
*******************************************************************************/
void IIC_Init(void)
{
CLK_PCKENR1 |= 0x01; //启用I2C外设时钟
PE_DDR &= 0xf9; //PE1,PE2设置为悬浮输入
PE_CR1 &= 0xf9; //该位对于真正的OD口是无作用的
PE_CR2 &= 0xf9;
I2C_CR1 = 0x00; //禁用I2C模块用以配置时钟
I2C_FREQR |= 0x10; //时钟为16MHz
//I2C_FREQR |= 0x01; //时钟为1MHz
I2C_OARH = 0x40; //7位地址模式
I2C_OARL = 0xa0;
I2C_CCRL |= 0x50; //50H<- ->80D x 62.5ns = 5000ns
I2C_CCRH |= 0x00; //I2C为标准模式
I2C_TRISER = 0x11; //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
//I2C_TRISER = 0x02; //时钟为1MHz时
//I2C_ITR |= 0x00; //禁止I2C中断
//I2C_CR2 |= 0x04; //开启应?
I2C_CR1 |= 0x01;
}
/*******************************************************************************
函数名称: void IIC_Start(u8 addres)
函数功能: I2C start function
输入参数: null
输出参数: Device Address
编写日期: 2017.09.06
代码作者: sinco.170
*******************************************************************************/
void IIC_Start(u8 addres)
{
while(I2C_SR3 & 0x02); //检查总线是否空闲
I2C_CR2 |= 0x01; //产生起始信号
while(!(I2C_SR1 & 0x01)); //等待起始信号发送完成
I2C_DR = addres; //发送从器件地址
}
/*******************************************************************************
函数名称: void IIC_Stop(void)
函数功能: I2C stop function
输入参数: null
输出参数: null
编写日期: 2017.09.06
代码作者: sinco.170
*******************************************************************************/
void IIC_Stop(void)
{
//while(!(I2C_SR1 & 0x04)); //等待发送结束
I2C_CR2 |= 0x02; //产生结束信号
}
/*******************************************************************************
函数名称: void IIC_SendByte(u8 addres,u8 addr,u8 dat)
函数功能: I2C发送一个字节
输入参数: addres=器件地址,addr=器件写入地址,dat=数据
输出参数: null
编写日期: 2017.09.06
代码作者: sinco.170
*******************************************************************************/
void IIC_SendByte(u8 addres,u8 addr,u8 dat)
{
u8 temp = 0x00;
IIC_Start(addres); //
while(!(I2C_SR1 & 0x02)); //等待地址发送完成
temp = I2C_SR1;
temp + I2C_SR3;
while(!(I2C_SR1 & 0x80)); //等待发送寄存器空
I2C_DR = addr; //发送写入地址到数据寄存器
while(!(I2C_SR1 & 0x04)); //等待数据发送完成
while(!(I2C_SR1 & 0x80)); //等待发送寄存器空
I2C_DR = dat; //发送数据
while(!(I2C_SR1 & 0x04)); //等待发送字节完成
temp = I2C_SR1; //清除标志位
temp = I2C_SR3;
IIC_Stop();
}
sincomaster 发表于 2018-8-17 17:48
这是我的硬件IIC,我是用寄存器操作的,可以看下,已可以点亮OLED了,
谢谢大哥 很好很好,学习学习
页:
[1]