历史上的今天
返回首页

历史上的今天

今天是:2025年04月25日(星期五)

正在发生

2019年04月25日 | STM8S105K4 SPI相关代码

2019-04-25 来源:eefocus

/* 初始化函数 */

void SPI_FLASH_Init(void)

{

   SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER,

            SPI_CLOCKPOLARITY_HIGH, SPI_CLOCKPHASE_2EDGE,

            SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT, 0x07);

   SPI_Cmd(ENABLE);

   GPIO_Init(SPI_CS , SPI_Pin_CS, GPIO_MODE_OUT_PP_HIGH_FAST);

   GPIO_WriteHigh(SPI_CS, SPI_Pin_CS)

}


/*


写使能


*/


void SPI_FLASH_WriteEnable(void)

{

  /* Select the FLASH: Chip Select low */

  SPI_FLASH_CS_LOW();



  /* Send "Write Enable" instruction */

  SPI_FLASH_SendByte(WREN);



  /* Deselect the FLASH: Chip Select high */

  SPI_FLASH_CS_HIGH();

}


/**


发送一个字节的数据


*/


u8 SPI_FLASH_SendByte(u8 byte)

{

 while (SPI_GetFlagStatus( SPI_FLAG_TXE) == RESET);

 SPI_SendData(byte);

  while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);

  return SPI_ReceiveData();  

 }


/*


等待写数据结束


*/


void SPI_FLASH_WaitForWriteEnd(void)


{

  u8 FLASH_Status = 0;

  SPI_FLASH_CS_LOW();

  SPI_FLASH_SendByte(RDSR);

  do

  {

    /* Send a dummy byte to generate the clock needed by the FLASH

    FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);

 }

  while ((FLASH_Status & WIP_Flag) == SET); /* Write in progress */

  SPI_FLASH_CS_HIGH();

}


/*


写一页数据


*/


void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)


{

  SPI_FLASH_WriteEnable();

  SPI_FLASH_CS_LOW();

 SPI_FLASH_SendByte(WRITE);

  /****************************************************************/

  /* Send WriteAddr high nibble address byte to write to */

  SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);

  /* Send WriteAddr medium nibble address byte to write to */

  SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);

  /* Send WriteAddr low nibble address byte to write to */

  SPI_FLASH_SendByte(WriteAddr & 0xFF);

 /*****************************************************************/



  /* while there is data to be written on the FLASH */

  while (NumByteToWrite--)

  {

    /* Send the current byte */

    SPI_FLASH_SendByte(*pBuffer);

    /* Point on the next byte to be written */

    pBuffer++;

  }

  SPI_FLASH_CS_HIGH();

  SPI_FLASH_WaitForWriteEnd();

}


/*


写BUFFER数据


*/


void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)

{

  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;



  Addr = WriteAddr % SPI_FLASH_PageSize;// 判断是否是页对齐

  count = SPI_FLASH_PageSize - Addr;   //一页里的第几个

  NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;

  NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;



  if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */

  {

    if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */

    {

      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);

    }

    else /* NumByteToWrite > SPI_FLASH_PageSize */

    {

      while (NumOfPage--)

      {

        SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);

        WriteAddr +=  SPI_FLASH_PageSize;

        pBuffer += SPI_FLASH_PageSize;

      }



      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);

    }

  }

  else /* WriteAddr is not SPI_FLASH_PageSize aligned  */

  {

    if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */

    {

      if (NumOfSingle > count)

      { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */

        temp = NumOfSingle - count;



        SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);

        WriteAddr +=  count;

        pBuffer += count;



        SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);

      }

      else

      {

        SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);

      }

    }

    else /* NumByteToWrite > SPI_FLASH_PageSize */

    {

      NumByteToWrite -= count;

      NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;

      NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;



      SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);

      WriteAddr +=  count;

      pBuffer += count;



      while (NumOfPage--)

      {

        SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);

        WriteAddr +=  SPI_FLASH_PageSize;

        pBuffer += SPI_FLASH_PageSize;

      }



      if (NumOfSingle != 0)

      {

        SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);

      }

    }

  }

}


/*


读一个buffer数据


*/


void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)

{

  /* Select the FLASH: Chip Select low */

  SPI_FLASH_CS_LOW();

  SPI_FLASH_SendByte(READ);

  /* Send ReadAddr high nibble address byte to read from */

  SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);

  /* Send ReadAddr medium nibble address byte to read from */

  SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);

  /* Send ReadAddr low nibble address byte to read from */

  SPI_FLASH_SendByte(ReadAddr & 0xFF);



  while (NumByteToRead--) /* while there is data to be read */

  {

    /* Read a byte from the FLASH */

    *pBuffer = SPI_FLASH_SendByte(Dummy_Byte);

    /* Point to the next location where the byte read will be saved */

    pBuffer++;

  }


  SPI_FLASH_CS_HIGH();

}


推荐阅读

史海拾趣

Abundance Enterprise Company公司的发展小趣事

Abundance Enterprise Company注重品牌建设和市场推广工作。公司通过多种渠道加强品牌宣传和推广,提高品牌知名度和美誉度。同时,公司还积极参与社会公益活动,履行企业社会责任,树立了良好的企业形象。这些举措有效提升了公司的市场竞争力,为公司的快速发展提供了有力保障。

Galaxy Microelectronics公司的发展小趣事

飞翼科技(FEIYI)在多个领域的发展均体现了其创新驱动的发展战略。无论是无人机技术的智能化应用,还是绿色矿山技术的创新突破,亦或是电容式触摸感应芯片的市场领先,都离不开公司对技术创新的不断追求。飞翼科技积极与高校、研究机构及行业专家开展合作,集聚顶尖科技人才,共同推动技术进步和产业升级。同时,公司还注重知识产权保护,拥有国家专利技术300余项,为企业的持续发展提供了有力保障。通过这些努力,飞翼科技在电子行业中不断崛起,成为行业内的佼佼者。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

ANSHAN公司成立于上世纪末,当时正值电子行业的蓬勃发展期。创始人李先生凭借对电子技术的深厚理解和敏锐的市场洞察力,决定投身于这个充满机遇的领域。初创时期的ANSHAN面临资金短缺、人才匮乏和技术壁垒等多重挑战。然而,李先生带领团队日夜兼程,不断研发新产品,拓展市场渠道。他们坚持自主创新,不断攻克技术难题,逐渐在电子行业中崭露头角。

Crystek公司的发展小趣事

尽管Crystek公司在发展过程中取得了显著的成就,但也面临着一些挑战和困难。例如,随着行业竞争的加剧和市场需求的不断变化,公司需要不断调整战略方向和产品结构以适应市场的变化。同时,公司还需要加强人才培养和团队建设,提升员工的技能水平和创新能力。然而,Crystek公司始终保持着积极进取的态度和勇于面对挑战的精神,相信在未来的发展中,公司将继续保持领先地位并创造更加辉煌的业绩。

这五个故事展示了Crystek公司在电子行业中的发展历程和取得的成就。从创业起步到技术创新、市场拓展、部门专业化以及应对挑战和未来发展,Crystek公司始终保持着积极进取的精神和不断创新的态度,为电子行业的发展做出了重要贡献。

APM Hexseal公司的发展小趣事

在军队取得初步成功后,APM Hexseal的产品开始进入工业和商业市场。其硅胶密封套系列可与世界各地使用的绝大多数开关、断路器、编码器、电位计和其他旋转设备配合使用,得到了广泛的认可和应用。无论是航空电子、仪器仪表、通讯还是建筑、船舶、医疗等行业,APM Hexseal的产品都发挥着重要的作用。

Eon公司的发展小趣事

随着全球对环保和可持续发展的关注日益增加,E.ON也开始加快绿色能源转型的步伐。公司加大了对可再生能源的投资力度,积极开发风电、太阳能等清洁能源项目。同时,E.ON还积极推广智能电网技术,提高能源利用效率,降低环境污染。

问答坊 | AI 解惑

创建一个NIOS环境的视频教程

视频内容为如何创建一个NIOS环境的视频教程,入门级的,很不错…

查看全部问答>

1.4亿IC卡安全有隐患:掌握技术可修改钱数

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑   非接触式IC卡核心技术被破解 涉及高校公交及其他公共领域   日前,工业和信息部发布了《关于做好应对部分IC卡出现严重安全漏洞工作的通知》,要求各地各机关和部门开展对IC卡使用情 ...…

查看全部问答>

请教,从单片机到ARM的转行,大家是怎么做的?

是自学后达到要求再跳槽的?还是,先找到ARM方面的工作(不知可行性如何),在工作中学习的?…

查看全部问答>

高分请教关于BISS0001的一些问题!!

如上图 请教一下红圈子中的所有元件及参数的意义。 包括R6\\C3 ,R8\\C5  ,R5\\C2  ,R7\\C4 ,它们在整个电路所起的具体作用是什么 BISS0001说明书我看不懂,所以别叫我再去看那个东西…

查看全部问答>

请问:单片机初始化必须用汇编语言?

C不能初始化单片机么? 我现在正在做毕业设计,想用C语言做,用的单片机是Phfilip 89C51。…

查看全部问答>

有人做过单片机的液体流量计么?

老师就给了这么一题目,我们打算用单片机做,不知道谁有这方面或这类的资料,或者指点一二,谢谢了啊…

查看全部问答>

请教各位关于gui的问题!

我刚刚实习,做嵌入式,想彻底学习一个gui系统的源码,哪位前辈指点下: 1.学习哪个开源gui的代码? 2.怎么样最快的入手,进步? 感谢~…

查看全部问答>

TCPMP 0.72RC1用VS2005编译出错

使用VS2005编译TCPMP 0.72RC1出错。 安装了CE6.0的SDK. 设置如下: Properties->C/C++->Advanced->Compile For Architecture->ARM4(/QRarch4) Properties->Linker->Advanced->Targer Machine->MachineTHUMB 首先编译的的common,可是提示出错: ...…

查看全部问答>

本人有6410开发板刚刚上市,宇宙最低价1300元,联系方式QQ:767800652

本人有6410开发板刚刚上市,宇宙最低价1300元,联系方式QQ:767800652 QQ: 767800652 手机:15914387571 Email:LongFei_Y@163.com 地址:广州科学城香山路17号B栋6楼 idea6410是一款高端ARM11处理器开发板,专为消费类电子、工业控制、车载导 ...…

查看全部问答>

UCGUI能否开发GIS系统,可以的话怎么开发??

UCGUI能否开发GIS系统,可以的话怎么开发??…

查看全部问答>