历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2018年10月15日 | STM32之SPI读写外部FLASH

2018-10-15 来源:eechina

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

SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器

         SST25V_DBSY();

 

SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器

         SST25V_DBSY();

实验目的:将数据写入外部FLASH中,然后再读出来显示在LCD上

实验平台:基于STM32F103C8T6的彩屏开发板

FLASH:SST25VF016B

 

 

图1:FLASH硬件接口

[转载]STM32之SPI读写外部FLASH


图2:SST25VF016地址自增写数据
[转载]STM32之SPI读写外部FLASH
图3:SST25VF016的状态寄存器
[转载]STM32之SPI读写外部FLASH
图4:SST25VF016指令码
[转载]STM32之SPI读写外部FLASH

 

主要的实验代码:

 

Flash.h

#ifndef __FLASH_H

#define __FLASH_H                        

#include "sys.h"

 

#define       SPI_FLASH_CS PAout(9)  //选中FLASH                                       

////////////////////////////////////////////////////////////////////////////

//SST25VF016读写

#define FLASH_ID 0XBF41

//指令表

#define SST25_ReadData                         0x03

#define SST25_FastReadData                     0x0B

#define SST25_4KByte_BlockERASE                0x20

#define SST25_32KByte_BlockErase               0x52

#define SST25_64KByte_BlockErase               0xD8

#define SST25_ChipErase                        0xC7

#define SST25_ByteProgram                      0x02

#define SST25_AAI_WordProgram                  0xAD

#define SST25_ReadStatusReg                    0x05

#define SST25_EnableWriteStatusReg             0x50

#define SST25_WriteStatusReg                   0x01

#define SST25_WriteEnable                      0x06

#define SST25_WriteDisable                     0x04

#define SST25_ManufactDeviceID                 0x90

#define SST25_JedecDeviceID                    0x9F

#define SST25_EBSY                             0x70

#define SST25_DBSY                             0x80

 

 

void SPI_Flash_Init(void);

u16  SPI_Flash_ReadID(void);                //读取FLASH ID

u8     SPI_Flash_ReadSR(void);        //读取状态寄存器

void SPI_FLASH_Write_SR(u8 sr);     //写状态寄存器

void SPI_FLASH_Write_Enable(void);  //写使能

void SPI_FLASH_Write_Disable(void); //写保护

void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead);   //读取flash

void SPI_Flash_Erase_Chip(void);        //整片擦除

void SPI_Flash_Erase_Sector(u32 Dst_Addr);//扇区擦除

void SPI_Flash_Wait_Busy(void);           //等待空闲

void SST25V_EBSY(void);

void SST25V_DBSY(void);

void Flash_WriteByte(u8* pBuffer,u32 WriteAddr);//写入1Byte数据

void AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr);//地址自动增加的写数据A

void AutoAddressIncrement_WordProgramB(u8 state,u8 Byte1, u8 Byte2);//地址自动增加的写数据B

void SPI_Flash_Write(u8 pBuffer[],u32 WriteAddr,u16 NumByteToWrite);//结合AB构成的地址自动增加的连续数据的写入

#endif

 

 

flash.c

#include "flash.h"

#include "spi.h"

#include "delay.h"

//4Kbytes为一个Sector

//16个扇区为1个Block

//SST25VF016B

//容量为2M字节,共有32个Block(块),512个Sector(扇区)

//初始化SPI FLASH的IO口

//修改状态寄存器,允许芯片存储器被写

void SPI_Flash_Init(void)

{

         RCC->APB2ENR|=1<<2;       //PORTA时钟使能        

         GPIOA->CRH&=0XFFFFFF0F;

         GPIOA->CRH|=0X00000030;//PA9 推挽         

         GPIOA->ODR|=1<<9;    //PA9上拉

         SPIx_Init();                     //初始化SPI

 

      SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器

         SST25V_DBSY();

 

//读取SPI_FLASH的状态寄存器

//BIT7  6   5   4   3   2   1   0

//SPR   RV  TB BP2 BP1 BP0 WEL BUSY

//SPR:默认0,状态寄存器保护位,配合WP使用

//TB,BP2,BP1,BP0:FLASH区域写保护设置

//WEL:写使能锁定

//BUSY:忙标记位(1,忙;0,空闲)

//默认:0x00

u8 SPI_Flash_ReadSR(void)  

         u8 byte=0;  

         SPI_FLASH_CS=0;                            //使能器件  

         SPIx_ReadWriteByte(SST25_ReadStatusReg);    //发送读取状态寄存器命令   

         byte=SPIx_ReadWriteByte(0Xff);             //读取一个字节 

         SPI_FLASH_CS=1;                            //取消片选    

         return byte;  

}

//写SPI_FLASH状态寄存器

//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!

void SPI_FLASH_Write_SR(u8 sr)  

{  

         SPI_FLASH_CS=0;    //片选

         SPIx_ReadWriteByte(SST25_EnableWriteStatusReg);  //使能写状态寄存器命令  

         SPI_FLASH_CS=1;    //取消片选

         SPI_FLASH_CS=0; //片选                        

         SPIx_ReadWriteByte(SST25_WriteStatusReg);   //发送写取状态寄存器命令   

         SPIx_ReadWriteByte(sr);               //写入一个字节 

         SPI_FLASH_CS=1;                           //取消片选                 

}  

//SPI_FLASH写使能

//将WEL置位  

void SPI_FLASH_Write_Enable(void)  

{

         SPI_FLASH_CS=0;                            //使能器件  

    SPIx_ReadWriteByte(SST25_WriteEnable);      //发送写使能 

         SPI_FLASH_CS=1;                            //取消片选               

}

//SPI_FLASH写禁止

//将WEL清零 

void SPI_FLASH_Write_Disable(void)  

         SPI_FLASH_CS=0;                            //使能器件  

    SPIx_ReadWriteByte(SST25_WriteDisable);     //发送写禁止指令   

         SPI_FLASH_CS=1;                            //取消片选               

}                             

//读取芯片ID SST25VF016的是 0XBF41

u16 SPI_Flash_ReadID(void)

{

         u16 Temp = 0;      

         SPI_FLASH_CS=0;   

         //发送读取ID命令                           

         SPIx_ReadWriteByte(0x90);

         //发送24位的地址        

         SPIx_ReadWriteByte(0x00);             

         SPIx_ReadWriteByte(0x00);             

         SPIx_ReadWriteByte(0x00);

         //读取返回的16位值                              

         Temp=SPIx_ReadWriteByte(0xFF)<<8;//高8位数据

         Temp+=SPIx_ReadWriteByte(0xFF);      //底八位数据

 

         SPI_FLASH_CS=1;                                   

         return Temp;

}

//读取SPI FLASH 

//在指定地址开始读取指定长度的数据

//pBuffer:数据存储区

//ReadAddr:开始读取的地址(24bit)

//NumByteToRead:要读取的字节数(最大65535即64k)

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

{

        u16 i;                                                                                                                

         SPI_FLASH_CS=0;                            //使能器件  

    SPIx_ReadWriteByte(SST25_ReadData);         //发送读取命令

         //发送24bit地址   

    SPIx_ReadWriteByte((u8)((ReadAddr)>>16));   

    SPIx_ReadWriteByte((u8)((ReadAddr)>>8));  

    SPIx_ReadWriteByte((u8)ReadAddr);

          

    for(i=0;i

         {

        pBuffer[i]=SPIx_ReadWriteByte(0XFF);   //循环读数 

    }

         SPI_FLASH_CS=1;                            //取消片选               

//地址自动增加的写数据A

void AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr)

{

         SPI_FLASH_Write_Enable();

         SPI_FLASH_CS=0;

         SPIx_ReadWriteByte(SST25_AAI_WordProgram);

         //输入所要写数据的起始地址

         SPIx_ReadWriteByte((Addr & 0xFF0000) >> 16);

         SPIx_ReadWriteByte((Addr & 0xFF00) >> 8);

         SPIx_ReadWriteByte(Addr & 0xFF);

         //发送最初的两个数据

         SPIx_ReadWriteByte(Byte1);

         SPIx_ReadWriteByte(Byte2);

        

         SPI_FLASH_CS=1;

         SPI_Flash_Wait_Busy();

}

 

//地址自动增加的写数据B

void AutoAddressIncrement_WordProgramB(u8 state,u8 Byte1, u8 Byte2)

{

         SPI_FLASH_Write_Enable();

         SPI_FLASH_CS=0;

         SPIx_ReadWriteByte(SST25_AAI_WordProgram);

        

         SPIx_ReadWriteByte(Byte1);

         SPIx_ReadWriteByte(Byte2);

        

         SPI_FLASH_CS=1;

         SPI_Flash_Wait_Busy();

        

         if(state==1)

         {

         SPI_FLASH_Write_Disable();

         }

         SPI_Flash_Wait_Busy();

}

 

//结合AB构成的地址自动增加的连续数据的写入

//具有先擦除待写区域的功能

//pBuffer:为待写数据组

//WriteAddr:所写数据的起始地址

//NumByteToWrite:所要写的数据的长度

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

{

         u16 i,temp;

         u32 secpos;

         u16 secoff;

         u16 secremain;

         //以下代码为擦除待写区域的代码

         secpos=WriteAddr/4096;//扇区(4K)地址0~511 for     SST25VF016

         secoff=WriteAddr@96;//在扇区内的偏移

         secremain=4096-secoff;//扇区剩余空间大小

         if(NumByteToWrite

         {

                   temp=1;

         }

         else//剩余空间小于所存数据

         {

                   i=NumByteToWrite-secremain;

                   //判断还占了几个扇区

                   if(i@96==0)

                   {

                            temp=i/4096+1;

                   }

                   else

                   {      

                            temp=i/4096+2;

                   }

         }

         for(i=0;i

         {

                   SPI_Flash_Erase_Sector((secpos+i)*4096); //擦除将要写入数据的扇区   

         }

 

         //以下代码为将数据写入指定地址的代码

         if(NumByteToWrite%2==0)

         {

                   temp=NumByteToWrite/2-1;

         }

         else

         {

                   temp=NumByteToWrite/2;

         }

         AutoAddressIncrement_WordProgramA(pBuffer[0], pBuffer[1],WriteAddr );        //开始写数据

          for(i=1;i

          {

                 AutoAddressIncrement_WordProgramB(0,pBuffer[2*i], pBuffer[2*i+1]);

          }

          if(NumByteToWrite%2==0)

         {

                 AutoAddressIncrement_WordProgramB(1,pBuffer[NumByteToWrite-2], pBuffer[NumByteToWrite-1]);   //结束写数据

          }

          else

          {

                 AutoAddressIncrement_WordProgramB(1,pBuffer[NumByteToWrite-1],0); //结束写数据

          }

}

 

//写入1Byte数据

//pBuffer:待写的数据

//WriteAddr:待写数据的地址

void Flash_WriteByte(u8* pBuffer,u32 WriteAddr)

{

         u32 secpos;

         secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16  4096=4k

         SPI_Flash_Erase_Sector(secpos);//擦除这个扇区

        

         SPI_FLASH_Write_Enable();                  //SET WEL

         SPI_FLASH_CS=0;                           //使能器件  

    SPIx_ReadWriteByte(SST25_ByteProgram );     //发送写页命令

         //发送24bit地址   

    SPIx_ReadWriteByte((u8)((WriteAddr)>>16));  

    SPIx_ReadWriteByte((u8)((WriteAddr)>>8));  

    SPIx_ReadWriteByte((u8)WriteAddr);

         //发送待写的数据

         SPIx_ReadWriteByte(pBuffer[0]);

         SPI_FLASH_CS=1; 

         SPI_Flash_Wait_Busy();//等待写完成

                  

}

//擦除整个芯片

//整片擦除时间:

//W25X16:25s

//W25X32:40s

//W25X64:40s

//等待时间超长...

void SPI_Flash_Erase_Chip(void)  

{                                            

    SPI_FLASH_Write_Enable();                  //SET WEL

    SPI_Flash_Wait_Busy();  

       SPI_FLASH_CS=0;                            //使能器件  

    SPIx_ReadWriteByte(SST25_ChipErase);        //发送片擦除命令 

         SPI_FLASH_CS=1;                            //取消片选               

         SPI_Flash_Wait_Busy();                                   //等待芯片擦除结束

}  

//擦除一个扇区

//Dst_Addr:扇区地址 0~511 for w25x16

//擦除一个山区的最少时间:150ms

void SPI_Flash_Erase_Sector(u32 Dst_Addr)  

{  

    SPI_FLASH_Write_Enable();                  //SET WEL           

    SPI_Flash_Wait_Busy();  

       SPI_FLASH_CS=0;                            //使能器件  

    SPIx_ReadWriteByte(SST25_4KByte_BlockERASE);      //发送扇区擦除指令

    SPIx_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址   

    SPIx_ReadWriteByte((u8)((Dst_Addr)>>8));  

    SPIx_ReadWriteByte((u8)Dst_Addr); 

         SPI_FLASH_CS=1;                            //取消片选               

    SPI_Flash_Wait_Busy();                                    //等待擦除完成

//等待空闲

void SPI_Flash_Wait_Busy(void)  

{  

         while ((SPI_Flash_ReadSR()&0x01)==0x01);   // 等待BUSY位清空

void SST25V_EBSY(void)

{

         SPI_FLASH_CS=0;

         SPIx_ReadWriteByte( SST25_EBSY);

         SPI_FLASH_CS=1;   

}

void SST25V_DBSY(void)

{

         SPI_FLASH_CS=0;

         SPIx_ReadWriteByte( SST25_DBSY);

         SPI_FLASH_CS=1;   

}

 

 

主函数:

#include

#include"common.h"

#include"TFTLCD.h"

#include"spi.h"

#include"key.h"

#include"flash.h"

const u8 TEXT_Buffer[]={"Chen An SST25VF"};//待写入flash的数据

#define SIZE sizeof(TEXT_Buffer) //计算待写入数据的长度

int main(void)

{

         u8 key;

         u8 datatemp[SIZE]; //开辟空间用于存放从flash读回的数据

         Stm32_Clock_Init(9); //系统时钟初始化

         delay_init(72);//延时函数的初始化

         JTAG_Set(JTAG_SWD_DISABLE);//屏蔽JTAG和SWD调试,防止和LCD冲突

         LCD_Init();         //LCD初始化

         KEY_Init();         //按键初始化

         SPI_Flash_Init();//SPI关于flash的硬件接口初始化

         POINT_COLOR=RED;//设置字体颜色

         while(SPI_Flash_ReadID()!=FLASH_ID)//检验flash是否存在

         {

                   LCD_ShowString(60,130,"SST25VF Check Failed!");

                   delay_ms(500);

         }

         LCD_ShowString(60,130,"SST25VF Ready!");

         LCD_ShowString(60,150,"KEY1:Write KEY2:Read");

         POINT_COLOR=BLUE;

         while(1)

         {

                   key=KEY_Scan();        //按键扫描

                   if(key==1)//按键1按下,开始写数据到flash

                   {

                            LCD_Fill(0,170,239,319,WHITE);

                            LCD_ShowString(60,170,"Start Write SST25V");

                            SPI_Flash_Write((u8*)TEXT_Buffer,1000,SIZE); //写数据

                            LCD_ShowString(60,170,"SST25V Write Finished");

                   }

                   if(key==2) //按键2按下,开始从flash读回数据

                   {

                            LCD_ShowString(60,170,"Start Read SST25V");

                            SPI_Flash_Read(datatemp,1000,SIZE); //读数据 

                            LCD_ShowString(60,170,"The Data Is");

                            LCD_ShowString(60,190,datatemp);

 

                   }      

         }

}

 

总结:1.开始的时候,读取FLASH的ID成功,我觉得芯片一切正常,但是写入数据后读回来的全是“满屏”,纠结了一天才发现原 

        来是FLASH没有进行初始化,没有写 (SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器 SST25V_DBSY() )

        这两句导致数据无法写入FLASH。

      2.我在写程序的时候犯了个很低级的失误,在写乘法时用了 2i 结果一直提示有错误却没发现,直到过了半个小时才反应过

        该写成 2*i

      3.这个SST25VF016的关键在于连续数据的写入,需要仔细研究图二,我也是参考了一个网友的思路,在他得基础(A和B)拓

        展出最后的 SPI_FlashWrite 函数的,不过该函数还有很多的不确定因素,大家要结合主函数中的 SIZE 来进行思考。


推荐阅读

史海拾趣

Adafruit公司的发展小趣事

Adafruit Industries是一家总部位于美国纽约的开源硬件公司,致力于设计和制造创意电子产品。以下是该公司发展的五个相关故事:

  1. 公司创立与初期阶段: Adafruit Industries由Limor Fried于2005年创立,起初是一个个人项目。Limor Fried(也被称为Ladyada)是一位热衷于开源硬件和电子制作的工程师,她在创办Adafruit之前就已经是开源硬件社区的活跃成员。最初,Adafruit专注于销售自制的电子配件和模块,并提供相关的教育资源和项目指南。

  2. 开源文化的推动者: Adafruit是开源硬件运动的积极推动者之一,致力于促进开源硬件的发展和普及。公司提倡知识共享和技术开放,通过在GitHub上发布开源硬件项目和提供详细的教程,鼓励更多人参与到电子制作和创客活动中来。

  3. 产品线的不断扩展: 随着市场需求的增长和公司规模的扩大,Adafruit逐渐扩展了产品线,涵盖了各种电子配件、传感器、开发板等。公司还推出了一系列DIY电子套件,旨在帮助用户学习电子制作和编程技能。Adafruit的产品以其高品质和易用性而著称,受到了全球创客和电子爱好者的青睐。

  4. 教育和社区建设: Adafruit积极参与教育和社区建设工作,通过在线教程、视频教程、工作坊等方式,向学生和爱好者传授电子知识和技能。公司还定期举办各种活动和比赛,鼓励创客社区的互动和交流,推动创新和创意的产生。

  5. 持续创新和发展: 作为一家持续创新的公司,Adafruit不断推出新产品和解决方案,不断满足客户不断增长的需求。公司还与各种组织和机构合作,推动开源硬件的发展和应用,努力成为开源硬件领域的领先者和推动者。随着时间的推移,Adafruit将继续秉承其开源和创新的精神,为全球创客社区带来更多的惊喜和机会。

GeneSiC Semiconductor公司的发展小趣事

GeneSiC Semiconductor公司的发展故事

故事一:技术先驱与高性能SiC器件的开创

GeneSiC Semiconductor自成立以来,便致力于高性能碳化硅(SiC)功率器件的研发与生产。作为碳化硅技术的先驱,GeneSiC在2000年代初便开始布局,并成功开发出多款领先业界的SiC二极管和MOSFET技术。其产品覆盖从650V到6.5kV的广泛电压范围,满足从20W到20MW不同应用场景的需求。这些技术突破不仅提升了系统效率,还显著增强了设备的可靠性和耐用性,为汽车、工业和国防等多个领域带来了革命性的变化。

故事二:政府机构项目的深度参与

GeneSiC与全球多个政府机构紧密合作,参与了众多前沿技术研发项目。例如,为美国能源部(DOE)开发的6.5kV SiC晶闸管用于储能系统,以及为NASA金星探测任务提供的500°C单片集成SiC超结晶体管JBS二极管(MIDSJT)。这些项目不仅展示了GeneSiC在极端环境下的技术实力,还推动了SiC技术在关键领域的广泛应用。通过不断的技术创新与合作,GeneSiC在提升全球科技水平方面做出了重要贡献。

故事三:电动汽车市场的深度布局

随着电动汽车市场的快速崛起,GeneSiC迅速调整战略,将SiC技术应用于电动汽车的关键部件中。其高性能的SiC MOSFET和二极管不仅提升了电动汽车的充电效率和续航里程,还降低了电池系统的热损耗和重量。此外,GeneSiC还为快速充电站开发了高效、稳健的解决方案,如SK Signet的350kW快速充电器便采用了GeneSiC的SiC二极管,为电动汽车的快速普及提供了有力支持。

故事四:工业领域的广泛应用

在工业领域,GeneSiC的SiC技术同样展现出强大的竞争力。以埃克西德技术为例,该公司采用GeneSiC的SiC功率半导体,确保了其下一代工业材料处理设备的高频快速充电器的可靠性、安全性和易用性。GeneSiC的SiC MOSFET和MPS肖特基二极管在高频、大功率的应用场景下表现出色,为工业自动化和智能制造提供了强有力的技术支持。

故事五:与纳微半导体的战略合并

2022年,氮化镓(GaN)功率芯片领导者纳微半导体宣布收购GeneSiC Semiconductor,这一战略合并标志着两家公司在下一代功率半导体领域的强强联合。合并后的公司不仅拥有全面的SiC和GaN技术组合,还通过资源整合和市场拓展,进一步巩固了其在全球功率半导体市场的领先地位。GeneSiC的丰富技术积累和纳微半导体的市场渠道优势相结合,为双方带来了新的增长动力和市场机遇。

承兴(CX)公司的发展小趣事

然而,随着市场竞争的加剧和行业的变革,承兴也面临着巨大的挑战。为了应对这些挑战,承兴公司积极调整策略,加大对研发和创新的投入。公司不断推出具有自主知识产权的新产品和技术,以满足市场的不断变化和消费者的多样化需求。

AIRPAX公司的发展小趣事

近年来,随着数字化技术的快速发展,AIRPAX也开始积极探索数字化转型之路。公司加大了对智能化、自动化生产线的投入,提高了生产效率和质量。同时,AIRPAX还积极利用大数据、云计算等先进技术,对客户需求和市场趋势进行深入分析,以更好地满足客户需求并推动创新发展。

这些故事只是AIRPAX发展历程中的一部分,它们展示了AIRPAX如何在技术、市场、环保和创新等多个方面取得了显著成就。然而,随着电子行业的不断发展和竞争的加剧,AIRPAX仍需继续努力,以保持其在电气保护领域的领先地位。

Flexxon Pte Ltd公司的发展小趣事

随着电子行业的不断发展和市场需求的日益多样化,Flextronics(Flexxon Pte Ltd)开始实施多元化战略,积极拓展新的业务领域。公司不仅继续深耕消费电子、通信设备等传统市场,还积极涉足汽车电子、医疗电子、物联网等新兴领域。通过并购、合作等多种方式,Flextronics不断拓宽产品线和服务范围,为客户提供更加全面和专业的解决方案。这一战略调整不仅为公司带来了新的增长点,也进一步提升了公司的市场竞争力。

BALLUFF公司的发展小趣事

随着自动化技术的不断进步,传感器技术的需求也日益增长。BALLUFF公司紧跟时代潮流,不断推出创新的传感器产品。从1968年开始生产感应式接近开关BES,到1978年光学开关BOS的面世,再到后来由微型处理器控制的转换机构与角度编码器的加入,BALLUFF在传感器领域的技术实力不断增强。此外,公司还陆续推出了旋转传感器BRG、识别系统BIS和超声波位移传感器BTL等产品,进一步丰富了其传感器产品线,满足了不同行业的需求。

问答坊 | AI 解惑

比克奇急聘FPGA工程师

招聘职位/职位要求 A、Firmware/baseband Engineer Position Requirements:   1. Bachelor’s degree or above in Communications, Electronic or computer Engineering 2. At least 4 years (for Bachelor degree) or 2 years (f ...…

查看全部问答>

炎炎夏季,即将来临。

本周,气温又望到达35°了,大家工作之余,别忘避暑了…

查看全部问答>

求助关于中断的问题

小弟在用飞思卡尔芯片时遇到了一个问题:同一个中断能否重复响应?救助于论坛的给位大虾们…

查看全部问答>

小信号低频前置放大电路

哪位可以帮我设计一下低频小信号放大电路。是脉搏信号,只有几mv。有肌电等信号的干扰 想设计一个高输入阻抗,消除噪声的放大电路…

查看全部问答>

数据库问题

在vc6.0时用ado 访问数据库,要加入msado15.dll 那么在vs2005 基于智能设备访问数据库时,要加入哪些库和头文件阿 大家有没有知道的?…

查看全部问答>

SEMIWILL推出BT151S系列贴片可控硅晶闸管

SEMIWILL推出BT151S系列贴片可控硅晶闸管 产品型号:BT151S-500R BT151S-650R BT151S-800R 产品特性: 封装形式:TO-252(DPAK),取代SOT-428 通态均方根电流:12A 断态电压:500V 触发电流:15mA 包装方式:管装 符合RoHS环保要求 应用领 ...…

查看全部问答>

智能家居的市场推广

各位智能家居论坛的挚友们,小弟不才,许久前也做过智能家居的许多方案,但因种种原因搁置了,呵呵,今天在论坛看到朋友们对智能家居系统的热情,很是羡慕,但对于智能家居,最重要的还是要有完善的系统,方案推向市场,这是必然的,我做过市场调查 ...…

查看全部问答>

本人绝对的新手,有问题请教各位大侠们,望指点一二

最近刚开始学习单片机,都是自学的,看看视频什么的,看看书,现在开始动手开发板了。刚开始就遇到麻烦了,本人笔记本没有com口,所以无奈之下淘宝了一个USB转com数据线,里面有驱动,回来就安装了,驱动从计算机设备管理显示正常,装完之后是com13 ...…

查看全部问答>

跟随器接电阻起到什么作用?

跟随器接电阻起到什么作用?接电阻和不接电阻的区别是什么?…

查看全部问答>

炼狱传奇-缩减运算符之战

    缩减运算符是单目运算符,也有与或非运算。其与或非运算规则类似于位运算符的与或非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与或非运算,操作数是几位数则运算结果也是几位数。而缩减运算则不同,缩减运算是对单个 ...…

查看全部问答>