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

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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版