wrdt24435 发表于 2018-8-8 21:36:11

笔记与问题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:53

参考正点原子的寄存器开发例程

wrdt24435 发表于 2018-8-9 09:38:09

子曰好人 发表于 2018-8-9 08:38
参考正点原子的寄存器开发例程

刚刚搜索了下,是STM32的例程,我正学习的是STM8S的

子曰好人 发表于 2018-8-9 10:02:10

wrdt24435 发表于 2018-8-9 09:38
刚刚搜索了下,是STM32的例程,我正学习的是STM8S的

好吧,我不太了解stm8的资料,论坛或者网上搜索一下吧

sincomaster 发表于 2018-8-17 17:48:31

本帖最后由 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();
}

wrdt24435 发表于 2018-8-22 10:35:19

sincomaster 发表于 2018-8-17 17:48
这是我的硬件IIC,我是用寄存器操作的,可以看下,已可以点亮OLED了,

谢谢大哥

robter 发表于 2018-10-14 20:18:55

很好很好,学习学习
页: [1]
查看完整版本: 笔记与问题2