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

记录学习STM8S中遇到的问题和过程....

[复制链接]
sincomaster 发布时间:2018-8-3 17:54
阅读主题, 点击返回1楼
收藏 评论15 发布时间:2018-8-3 17:54
15个回答
sincomaster 回答时间:2018-8-17 18:03:00
共享一下我的IIC代码,如有问题还请大请不吝指正,谢谢!
  1. /*******************************************************************************
  2. 文件名称:        I2C文件
  3. 函数功能:        I2C Driver Code
  4. 软件平台:        STVD4.3.12
  5. 编写日期:        2018.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. 编写日期:        2018.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. 编写日期:        2018.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. 编写日期:        2018.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. 编写日期:        2018.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. }

  98. /*******************************************************************************
  99. 函数名称:        u8 IIC_ReadByte(void)
  100. 函数功能:        I2C读一个字节
  101. 输入参数:        null
  102. 输出参数:        返回已读到的数据
  103. 编写日期:        2018.09.06
  104. 代码作者:        sinco.170
  105. *******************************************************************************/
  106. u8 IIC_ReadByte(void)
  107. {
  108.        
  109. }

  110. void IIC_SendNByte(u8 txd)
  111. {
  112.        
  113. }
复制代码
sincomaster 回答时间:2018-8-18 00:53:43
今晚串口发送调试成功,可以去睡觉了,明天还得上班
2018-08-18_005142.jpg
sincomaster 回答时间:2018-8-18 09:37:49
用逻辑分析看到的数据包,还是不错的,哈哈,但很奇怪我的IIC怎么没有数据包呢,我可是一直在发0xa0呀.
2018-08-18_093211.jpg
2018-08-18_093247.jpg
sincomaster 回答时间:2018-9-12 10:55:14
8月底搬了家,搞得身体累得不行,最近没有学习,研究了一下字库:GT20L16S1Y的驱动,准备国庆搞一下这个,把SPI调试一下
叶子1568 回答时间:2018-10-12 11:31:49
楼主好厉害啊
robter 回答时间:2018-10-25 08:31:20
楼主软硬件开发的很好,值得学习
12

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版