你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

笔记与问题2

[复制链接]
wrdt24435 提问时间:2018-8-8 21:36 /
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:0]位定义串行时钟波特率。
2. 选择CPOL和CPHA 位,定义数据传输和串行时钟间的相位关系。
3. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。
4. 硬件模式下,在数据帧的全部传输过程中应把NSS脚连接到高电平;在软件
模式下,需设置SPI_CR2寄存器的SSM和SSI位为‘1’。
5. 必须设置MSTR(SPI主模式)和SPE位(SPI使能位)(只当NSS脚被连到高电平,
这些位才能保持为‘1’)。在这个配置中,MOSI脚是数据输出,而MISO脚是
数据输入。

收藏 评论6 发布时间:2018-8-8 21:36

举报

6个回答
子曰好人 回答时间: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了,
  1. /*******************************************************************************
  2. 文件名称:        I2C文件
  3. 函数功能:        I2C Driver Code
  4. 软件平台:        STVD4.3.12
  5. 编写日期:        2017.09.06
  6. 代码作者:        sinco.170
  7. 备注事项:        PE1 = SCL,PE2 = SDA(硬件I2C寄存器方式)
  8. *******************************************************************************/
  9. #include "stm8s.h"
  10. #include "iostm8s.h"
  11. #include "iic.h"

  12. //http://bbs.mydigit.cn/read.php?tid=2482933
  13. //http://bh7kqk.blog.163.com/blog/static/1274122912010102422751666/
  14. //http://www.openedv.com/thread-70958-1-1.html
  15. //http://blog.csdn.net/DevinTT/article/details/74854851
  16. /*******************************************************************************
  17. 函数名称:        void IIC_Init(void)
  18. 函数功能:        I2C初始化
  19. 输入参数:        null
  20. 输出参数:        null
  21. 编写日期:        2017.09.06
  22. 代码作者:        sinco.170
  23. *******************************************************************************/
  24. void IIC_Init(void)
  25. {       
  26.         CLK_PCKENR1 |= 0x01;                //启用I2C外设时钟
  27.        
  28.         PE_DDR                 &= 0xf9;                //PE1,PE2设置为悬浮输入
  29.         PE_CR1                 &= 0xf9;                //该位对于真正的OD口是无作用的
  30.         PE_CR2                 &= 0xf9;                       
  31.         I2C_CR1             = 0x00;                //禁用I2C模块用以配置时钟
  32.         I2C_FREQR   |= 0x10;                //时钟为16MHz
  33.         //I2C_FREQR   |= 0x01;                //时钟为1MHz
  34.         I2C_OARH          = 0x40;                //7位地址模式
  35.         I2C_OARL     = 0xa0;
  36.         I2C_CCRL    |= 0x50;                //50H<- ->80D x 62.5ns = 5000ns
  37.         I2C_CCRH    |= 0x00;                //I2C为标准模式
  38.         I2C_TRISER   = 0x11;                //配置SCL上升时间,1000ns/62.5ns = 16,16+1 = 0x11
  39.         //I2C_TRISER   = 0x02;                //时钟为1MHz时
  40.         //I2C_ITR          |= 0x00;                //禁止I2C中断
  41.         //I2C_CR2     |= 0x04;                //开启应?
  42.         I2C_CR1     |= 0x01;
  43. }

  44. /*******************************************************************************
  45. 函数名称:        void IIC_Start(u8 addres)
  46. 函数功能:        I2C start function
  47. 输入参数:        null
  48. 输出参数:        Device Address
  49. 编写日期:        2017.09.06
  50. 代码作者:        sinco.170
  51. *******************************************************************************/
  52. void IIC_Start(u8 addres)
  53. {
  54.         while(I2C_SR3 & 0x02);                //检查总线是否空闲
  55.         I2C_CR2 |= 0x01;                        //产生起始信号
  56.         while(!(I2C_SR1 & 0x01));        //等待起始信号发送完成
  57.         I2C_DR = addres;                        //发送从器件地址
  58. }

  59. /*******************************************************************************
  60. 函数名称:        void IIC_Stop(void)
  61. 函数功能:        I2C stop function
  62. 输入参数:        null
  63. 输出参数:        null
  64. 编写日期:        2017.09.06
  65. 代码作者:        sinco.170
  66. *******************************************************************************/
  67. void IIC_Stop(void)
  68. {
  69.         //while(!(I2C_SR1 & 0x04));        //等待发送结束
  70.         I2C_CR2 |= 0x02;                        //产生结束信号
  71. }

  72. /*******************************************************************************
  73. 函数名称:        void IIC_SendByte(u8 addres,u8 addr,u8 dat)
  74. 函数功能:        I2C发送一个字节
  75. 输入参数:        addres=器件地址,addr=器件写入地址,dat=数据
  76. 输出参数:        null
  77. 编写日期:        2017.09.06
  78. 代码作者:        sinco.170
  79. *******************************************************************************/
  80. void IIC_SendByte(u8 addres,u8 addr,u8 dat)
  81. {
  82.         u8 temp = 0x00;
  83.        
  84.         IIC_Start(addres);                        //
  85.         while(!(I2C_SR1 & 0x02));        //等待地址发送完成
  86.         temp = I2C_SR1;
  87.         temp + I2C_SR3;
  88.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
  89.         I2C_DR = addr;                                //发送写入地址到数据寄存器
  90.         while(!(I2C_SR1 & 0x04));        //等待数据发送完成
  91.         while(!(I2C_SR1 & 0x80));        //等待发送寄存器空
  92.         I2C_DR = dat;                                //发送数据
  93.         while(!(I2C_SR1 & 0x04));        //等待发送字节完成
  94.         temp = I2C_SR1;                                //清除标志位
  95.         temp = I2C_SR3;
  96.         IIC_Stop();
  97. }
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wrdt24435 回答时间:2018-8-22 10:35:19
sincomaster 发表于 2018-8-17 17:48
这是我的硬件IIC,我是用寄存器操作的,可以看下,已可以点亮OLED了,

谢谢大哥
robter 回答时间:2018-10-14 20:18:55
很好很好,学习学习

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版