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

STM8S SPI单线通信中断程序

[复制链接]
磊元lystudio 发布时间:2015-10-6 21:47
阅读主题, 点击返回1楼
收藏 1 评论18 发布时间:2015-10-6 21:47
18个回答
JackieLaura 回答时间:2015-10-8 09:18:53
谢谢分享
stmcu.org.png
你好我好大家好! 回答时间:2015-10-8 11:12:45
帮顶                              
磊元lystudio 回答时间:2015-10-9 10:34:33
修改一个错误,在驱动HT1621时发现的,会导致HT1621驱动不正常。
先输出SCK引脚电平,再停止SPI接口模块,原来的顺序反了。
// 因为SPI接口模块被停止,无法控制SCK引脚电平
#define MFHSpiModSpiOff( )            if (SPICR1 & (u8)( ((1<<spiCPOL ))))                                \
                                      {                                                                   \
                                        MFH_PIN_OUT_SETH_SpiSclk;                                         \
                                      }                                                                   \
                                      else                                                                \
                                      {                                                                   \
                                        MFH_PIN_OUT_CLRL_SpiSclk;                                         \
                                      }                                                                   \
                                      SPICR1                       &= (u8)(~((1<<spiEN   )))            ;
懂事儿 回答时间:2016-3-16 11:22:41
哥能打包分享下驱动1621的例程吗?
磊元lystudio 回答时间:2016-3-19 01:24:07
打包没有办法,因为HT1621 字符液晶模块的字段涉及公司的利益,给你一段写入操作供参考:
#ifdef PreHt1621AccessingUseCommSpi                       // “HT1621 字符液晶使用SPI接口访问”条件编译
  // 写入全部的字段数值变量静态随机数据缓冲区数值
  if (   (gbitHt1621.WrRam == SET)
      && (gbitSpi.Busy == CLEAR)     )
  {
    switch (gstvSpi.StepSpi)                              // 判断SPI接口操作步骤值?
    {
      case 0:                                             // 步骤1:发送“禁止 HT1381 写入保护”操作命令
      {
        HSB(cHt1621SegSize) =  (cHt1621WriteRev >> 1);
#ifdef PreHt1621IdleWrPinAsInput                          // “写使能信号引脚空闲时为输入引脚”条件编译
        MFH_PIN_CFG_OUTL_Ht1621Wr;                        // 设置 HT1621 写使能引脚为输出引脚,并确保为L电平(没有操作时)
#else
        MFH_PIN_OUT_CLRL_Ht1621Wr;                        // 确保 HT1621 写使能引脚为L电平(没有操作时)
#endif                                                    // “PreHt1621IdleWrPinAsInput”
        MFH_PIN_OUT_CLRL_Ht1621Cs;                        // 使能 HT1621 片选信号(L电平)
        Ht1621SendBitMsb(cHt1621Write, 1);                // 写入标志码“101(数据写入模式)”的第1位
        CommSpiTxWithData(&HSB(cHt1621SegSize), 1);       // 写入标志码“101”的第2~3位和“Addr”的高 6 位

//#ifdef PreHt1621IdleWrPinAsInput                          // “写使能信号引脚空闲时为输入引脚”条件编译
//        MFH_PIN_CFG_OUTL_Ht1621Wr;                        // 设置 HT1621 写使能引脚为输出引脚,并确保为L电平(没有操作时)
//#else
//        MFH_PIN_OUT_CLRL_Ht1621Wr;                        // 确保 HT1621 写使能引脚为L电平(没有操作时)
//#endif                                                    // “PreHt1621IdleWrPinAsInput”
//        MFH_PIN_OUT_CLRL_Ht1621Cs;                        // 使能 HT1621 片选信号(L电平)
//        Ht1621SendBitMsb(cHt1621Write, 3);                // 写入标志码“101(数据写入模式)”
//        Ht1621SendBitMsb(0x00, 6);                        // 写入“Addr”的高 6 位
        gstvSpi.StepSpi++;                                // SPI接口操作步骤指向下一步
        break;
      }
      case 1:                                             // 步骤2:连续写入“全部的字段数值变量静态随机数据缓冲区”中的数据
      {
        CommSpiTxWithData(&HSB(0), cHt1621SegSize);
        gstvSpi.StepSpi++;                                // SPI接口操作步骤指向下一步
        break;
      }
      case 2:                                             // 步骤3:
      {
        MFH_PIN_OUT_SETH_Ht1621Cs;                        // 禁止 HT1621 片选信号(H电平)
        gstvSpi.StepSpi++;                                // SPI接口操作步骤指向下一步
        break;
      }
      default:
      {
        gbitHt1621.WrRdy    =  CLEAR;                     // 清除“写入输出映射缓冲区的数据准备就绪”标志
        gbitHt1621.WrRam    =  CLEAR;                     // 清除“正在写入输出映射缓冲区的数据”标志
        CommSpiClrSpiOk( );                               // 清除“占用SPI接口”标志
        break;
      }
    }
  }
  if (   (gbitHt1621.WrRdy == SET)
      && (gbitHt1621.WrRam == CLEAR)
      && (gbitSpi.SpiOk == CLEAR)    )
  {
    CommSpiSetSpiOk( );                                   // 设置“占用SPI接口”标志
    CommSpiBusModeDfLhMl(cSpiSpicrCfgDLL256);             // 设置SPI接口为数据锁存在第1个时钟沿、空闲时SCK为低电平、LSB首先发送
    gbitHt1621.WrRdy        =  CLEAR;                     // 清除“写入输出映射缓冲区的数据准备就绪”标志
    gbitHt1621.WrRam        =  SET;                       // 置“正在写入输出映射缓冲区的数据”标志
  }
#endif                                                    // “PreHt1621AccessingUseCommSpi”
磊元lystudio 回答时间:2016-3-19 01:24:41
typedef struct
{
  unsigned char Other       : 1;                          // 显示其他模式的映射缓冲区
  unsigned char Blink       : 1;                          // 闪烁状态为打开显示方式
  unsigned char Now         : 1;                          // 立即更新输出映射缓冲区的数据
  unsigned char WrRdy       : 1;                          // 写入输出映射缓冲区的数据准备就绪
  unsigned char WrRam       : 1;                          // 正在写入输出映射缓冲区的数据

  unsigned char Nte         : 1;                          // 立即更新输出映射缓冲区的数据

  unsigned char unusedBits  : 3;
} Ht1621FlagBits;
zcl201207 回答时间:2016-3-19 22:29:41
懂事儿 回答时间:2016-3-21 13:06:54
本帖最后由 懂事儿 于 2016-3-21 13:16 编辑

哥,我想要的不是HT1621这部分。
我想向您学习3线SPI接口,9bit模式应该怎么设置;指令数据选择位(D/C)怎么下发;
那个SPI_SendData();库函数只能下发8bit。
还有,我也不明白通讯例程中为什么都是设置为从模式?
主动与其它IC通讯时,MCU不是应该设置为主模式吗?


ldh119 回答时间:2020-5-9 22:08:29
表示没看懂
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 手机版