STM32驱动FM24CL16

发布者:心语如画最新更新时间:2017-09-09 来源: eefocus关键字:STM32  驱动FM24CL16 手机看文章 扫描二维码
随时随地手机看文章

根据小苗开发板例程,修改得好用的读写FM24CL16的2K bytes代码,分享给大家。

小苗开发板的程序有点问题,I2C_Read()里最后产生stop条件时间不对;另外FM24CL16是11位地址的,在I2C_Write()里也应体现出来。

先贴代码,以后再解析。


  1. /************************************************************** 

  2.  ** 函数名 :drv_i2c1_init 

  3.  ** 功能   : 初始化I2C1接口。包括GPIO配置和I2C1配置 

  4.     //PB6--I2C1_SCL, PB7--I2C1_SDA. 

  5.  ** 输入   :无 

  6.  ** 输出   :无 

  7.  ** 返回   :无 

  8.  ** 注意   :无 

  9. ***************************************************************/  

  10. void drv_i2c1_init(void)  

  11. {  

  12.     GPIO_InitTypeDef  GPIO_InitStructure; //GPIO  

  13.     I2C_InitTypeDef  I2C_InitStructure;   //IIC  

  14.   

  15.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); //使能I2C时钟  

  16.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIO时钟  

  17.   

  18.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;//IIC引脚PB6--SCL, PB7--SDA.  

  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        //复用开漏输出  

  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //50MHZ  

  21.     GPIO_Init(GPIOB, &GPIO_InitStructure);  

  22.   

  23.     I2C_DeInit(I2C1); //将I2C1寄存器重置为缺省值  

  24.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;        //设置I2C1为I2C模式  

  25.     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//I2C快速Tlow/Thigh = 2  

  26.     I2C_InitStructure.I2C_OwnAddress1 = 0x01;         //设置第一个设备自身地址·  

  27.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;       //使能应答ACK  

  28.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //定义应答地址7bit  

  29.     I2C_InitStructure.I2C_ClockSpeed = 200000;        //设置时钟频率200Khz  

  30.   

  31.     I2C_Cmd(I2C1, ENABLE); //使能IIC1  

  32.     I2C_Init(I2C1, &I2C_InitStructure);//初始化IIC1  

  33.     I2C_AcknowledgeConfig(I2C1, ENABLE);//使能应答功能  

  34. }  

  35. /************************************************************** 

  36.  ** 函数名 :I2C_Write_Byte 

  37.  ** 功能   :字节写入操作 

  38.  ** 输入   :addr:要写入的FRAM的地址,data:要写入的内容 

  39.  ** 输出   :无 

  40.  ** 返回   :无 

  41.  ** 注意   :无 

  42. ***************************************************************/  

  43. u8 I2C_Write_Byte(u16 addr,u8 data)  

  44. {  

  45.     u16 i = 0;  

  46.     u8 flag = 0;  

  47.   

  48.     addr = addr & 0x07FF;  

  49.       

  50.     I2C_GenerateSTART(I2C1, ENABLE);//产生IIC1传输START条件  

  51.     i = 0;  

  52.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) //检查EV5   

  53.     {  

  54.         i++;      

  55.         if(I2C_MAX_DEAD_TIME <= i)  

  56.         {  

  57.             flag = 1;    

  58.             break;  

  59.         }  

  60.     }   

  61.       

  62.     I2C_Send7bitAddress(I2C1, FRAM_ADDR|(((addr>>8)&0x07)<<1), I2C_Direction_Transmitter);//发送器件地址  

  63.   

  64.     i = 0;  

  65.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))//检查VE6    

  66.     {  

  67.         i++;      

  68.         if(I2C_MAX_DEAD_TIME <= i)  

  69.         {  

  70.             flag = 2;  

  71.             break;  

  72.         }  

  73.     }  

  74.       

  75.     I2C_SendData(I2C1, (u8)addr);//发送写地址  

  76.   

  77.     i = 0;  

  78.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))//检查VE8  

  79.     {  

  80.         i++;      

  81.         if(I2C_MAX_DEAD_TIME <= i)  

  82.         {  

  83.             flag = 3;  

  84.             break;  

  85.         }  

  86.     }  

  87.       

  88.     I2C_SendData(I2C1, (u8)data);//写入字节  

  89.   

  90.     i = 0;  

  91.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))//检查VE8    

  92.     {  

  93.         i++;      

  94.         if(I2C_MAX_DEAD_TIME <= i)  

  95.         {  

  96.             flag = 4;  

  97.             break;  

  98.         }  

  99.     }     

  100.    

  101.     I2C_GenerateSTOP(I2C1, ENABLE); //产生IIC传输STOP条件   

  102.     I2C_Standby();  

  103.   

  104.     return flag;  

  105. }  

  106.   

  107. /************************************************************** 

  108.  ** 函数名 :I2C_Write_Page 

  109.  ** 功能   :页写入操作 

  110.  ** 输入   :Waddr:要写入的FRAM的地址,pBuffer:存放要写入的内容,Num:写入的字节数。 

  111.     这里不做页检验,认为waddr和waddr+num都一页内的地址 

  112.  ** 输出   :无 

  113.  ** 返回   :无 

  114.  ** 注意   :一页8个字节,每次写入操作不得大于8 

  115. ***************************************************************/  

  116. static u8 I2C_Write_Page(u16 Waddr,u8* pBuffer, u8 Num)  

  117. {  

  118.     u16 i;  

  119.     u8 flag = 0;  

  120.   

  121.     Waddr = Waddr & 0x07FF;  

  122.   

  123.     i = 0;  

  124.     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) //总线忙  

  125.     {  

  126.         i++;      

  127.         if(I2C_MAX_DEAD_TIME <= i)  

  128.         {  

  129.             flag = 1;  

  130.             break;  

  131.         }  

  132.     }  

  133.       

  134.     I2C_GenerateSTART(I2C1, ENABLE);               //产生IIC1传输START条件  

  135.   

  136.     i = 0;  

  137.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))//检查EV5   

  138.     {  

  139.         i++;      

  140.         if(I2C_MAX_DEAD_TIME <= i)  

  141.         {  

  142.             flag = 2;  

  143.             break;  

  144.         }  

  145.     }  

  146.       

  147.     I2C_Send7bitAddress(I2C1, FRAM_ADDR|(((Waddr>>8)&0x07)<<1), I2C_Direction_Transmitter);//发送器件地址  

  148.   

  149.     i = 0;  

  150.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))//检查VE6  

  151.     {  

  152.         i++;      

  153.         if(I2C_MAX_DEAD_TIME <= i)  

  154.         {  

  155.             flag = 3;  

  156.             break;  

  157.         }  

  158.     }  

  159.       

  160.     I2C_SendData(I2C1, (u8)Waddr);//发送写地址  

  161.   

  162.     i = 0;  

  163.     while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))//检查VE8  

  164.     {  

  165.         i++;      

  166.         if(I2C_MAX_DEAD_TIME <= i)  

  167.         {  

  168.             flag = 4;  

  169.             break;  

  170.         }  

  171.     }  

  172.       

  173.     while(Num--)    

  174.     {  

  175.         I2C_SendData(I2C1, *pBuffer);//写入字节   

  176.         pBuffer++;  

  177.           

  178.         i = 0;  

  179.         while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))//检查VE8  

  180.         {  

  181.             i++;      

  182.             if(I2C_MAX_DEAD_TIME <= i)  

  183.             {  

  184.                 flag = 5;  

  185.                 break;  

  186.             }  

  187.         }         

  188.     }  

  189.     I2C_GenerateSTOP(I2C1, ENABLE);//产生IIC传输STOP条件   

  190.       

  191.     return flag;  

  192. }  

  193.   

  194. //For FM24CL16, 16384 bits = 2k bytes.  

  195. /************************************************************** 

  196.  ** 函数名 :I2C_Write 

  197.  ** 功能   :写入数据 

  198.  ** 输入   :Waddr:要写入的FRAM的地址,pBuffer:存放要写入的内容,Num:写入的字节数。 

  199.     对FM24CL16, Waddr是11位地址。 

  200.  ** 输出   :无 

  201.  ** 返回   :无 

  202.  ** 注意   : 

  203. ***************************************************************/  

  204. void I2C_Write(u16 Waddr,u8* pBuffer,  u16 Num)  

  205. {  

  206.     u8 ADDR;  

  207.   

  208.     Waddr = Waddr & 0x07FF;  

  209.       

  210.     ADDR=Waddr % I2C_PAGESIZE;  

  211.     ADDR=I2C_PAGESIZE-ADDR;   //差ADDR个字节,满1页;  

  212.   

  213.     if (Num <= ADDR)     //写页不对齐部分,且所有 数据在本页内  

  214.     {  

  215.         I2C_Write_Page(Waddr,pBuffer,Num);//不满一页的,写完直接跳出  

  216.         Num=0;  

  217.         I2C_Standby();    

  218.     }  

  219.     else  

  220.     {  

  221.         if(ADDR) //写页不对齐部分  

  222.         {  

  223.             I2C_Write_Page(Waddr,pBuffer,ADDR);  

  224.             Num-=ADDR;  //减去不对齐的字节  

  225.             Waddr+=ADDR;//写地址后移ADDR  

  226.             pBuffer+=ADDR;//指针后移ADDR  

  227.             I2C_Standby();  

  228.         }  

  229.           

  230.         while(Num)//写页对齐部分  

  231.         {  

  232.             if(Num>=I2C_PAGESIZE)//如果要写入的数据大于等于1页  

  233.             {  

  234.                 I2C_Write_Page(Waddr,pBuffer,I2C_PAGESIZE); //写一页  

  235.                 Num-=I2C_PAGESIZE;    //减去一页  

  236.                 Waddr+=I2C_PAGESIZE;  //写地址向后移一页  

  237.                 pBuffer+=I2C_PAGESIZE;//指针后移一页  

  238.                 I2C_Standby();  

  239.             }  

  240.             else  

  241.             {  

  242.                 I2C_Write_Page(Waddr,pBuffer,Num);//不满一页的,写完直接跳出  

  243.                 Num=0;  

  244.                 I2C_Standby();  

  245.             }  

  246.         }  

  247.     }  

  248. }  

  249.   

  250. /************************************************************** 

  251.  ** 函数名 :I2C_Read 

  252.  ** 功能   :从FRAM中读取1个或多个数据 

  253.  ** 输入   :Raddr:要读取的FRAM的地址,pBuffer存放从FRAM中读取的内容,Num:读取的字节数。 

  254.     //If the internal address reaches 7FFh it will wrap around to 000h on the next read cycle. 

  255.     上面说明read不用考虑页边界和256边界. 

  256.  ** 输出   :无 

  257.  ** 返回   :无 

  258.  ** 注意   :无 

  259. ***************************************************************/  

  260. u8 I2C_Read(u16 Raddr ,u8* pBuffer,u16 Num)  

  261. {  

  262.     u16 i;  

  263.     u8 flag = 0;  

  264.       

  265.     if(Num==0)  

  266.         return 0xFF;  

  267.   

  268.     Raddr = Raddr & 0x07FF;  

  269.   

  270.     i = 0;  

  271.     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) //检测总线忙标志位      

  272.     {  

  273.         i++;      

  274.         if(I2C_MAX_DEAD_TIME <= i)  

  275.         {  

  276.             flag = 1;  

  277.             break;  

  278.         }  

  279.     }  

  280.       

  281.     I2C_AcknowledgeConfig(I2C1, ENABLE);//允许应答  

  282.     I2C_GenerateSTART(I2C1, ENABLE);//产生IIC1传输START条件  

  283.   

  284.     i = 0;  

  285.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))//检查EV5  

  286.     {  

  287.         i++;      

  288.         if(I2C_MAX_DEAD_TIME <= i)  

  289.         {  

  290.             flag = 2;  

  291.             break;  

  292.         }  

  293.     }  

  294.       

  295.     I2C_Send7bitAddress(I2C1,  FRAM_ADDR|(((Raddr>>8)&0x07)<<1), I2C_Direction_Transmitter);//发送器件地址  

  296.   

  297.     i = 0;  

  298.     while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))//检查VE6  

  299.     {  

  300.         i++;      

  301.         if(I2C_MAX_DEAD_TIME <= i)  

  302.         {  

  303.             flag = 3;  

  304.             break;  

  305.         }  

  306.     }  

  307.       

  308.     I2C_SendData(I2C1, (u8)Raddr);//发送伪写地址  

  309.   

  310.     i = 0;  

  311.     while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))//检查VE8  

  312.     {  

  313.         i++;      

  314.         if(I2C_MAX_DEAD_TIME <= i)  

  315.         {  

  316.             flag = 4;  

  317.             break;  

  318.         }  

  319.     }     

  320.   

  321.     I2C_GenerateSTART(I2C1, ENABLE);//产生IIC1传输START条件  

  322.     i = 0;  

  323.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))//检查EV5  

  324.     {  

  325.         i++;      

  326.         if(I2C_MAX_DEAD_TIME <= i)  

  327.         {  

  328.             flag = 5;  

  329.             break;  

  330.         }  

  331.     }  

  332.       

  333.     I2C_Send7bitAddress(I2C1, FRAM_ADDR|(((Raddr>>8)&0x07)<<1), I2C_Direction_Receiver); //接收地址  

  334.   

  335.     i = 0;  

  336.     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))//检查VE6  

  337.     {  

  338.         i++;      

  339.         if(I2C_MAX_DEAD_TIME <= i)  

  340.         {  

  341.             flag = 6;  

  342.             break;  

  343.         }  

  344.     }  

  345.       

  346.     while (Num)  

  347.     {  

  348.         if(Num==1)  

  349.         {  

  350.             I2C_AcknowledgeConfig(I2C1, DISABLE);   //最后一位后要关闭应答的  

  351.             //I2C_GenerateSTOP(I2C1, ENABLE);           //发送停止位     //It's a bug.  

  352.         }  

  353.   

  354.         i = 0;  

  355.         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) //检测VE7        //always dead here.  

  356.         {  

  357.             i++;      

  358.             if(I2C_MAX_DEAD_TIME <= i)  

  359.             {  

  360.                 flag = 7;  

  361.                 break;  

  362.             }  

  363.         }  

  364.           

  365.         *pBuffer = I2C_ReceiveData(I2C1);  

  366.         pBuffer++;  

  367.         Num--;  

  368.     }  

  369.   

  370.     I2C_GenerateSTOP(I2C1, ENABLE);         //发送停止位     //It's a bug.     

  371.     I2C_AcknowledgeConfig(I2C1, ENABLE);//再次允许应答模式  

  372.   

  373.     return flag;  

  374. }  

  375.   

  376. /* 

  377. //FM24CL16不需要忙等待,EEPROM才需要 

  378. Unlike other nonvolatile memory technologies, there is no write delay with FRAM.  

  379. The entire memory cycle occurs in less time than a single bus clock. 

  380. Therefore, any operation including read or write can occur immediately following a write.  

  381. Acknowledge polling, a technique used with EEPROMs to determine if a write is complete is unnecessary and 

  382. will always return a 'ready' condition. 

  383. An actual memory array write occurs after the 8th data bit is transferred. 

  384. */  

  385. /************************************************************** 

  386.  ** 函数名 :I2C_Standby 

  387.  ** 功能   :忙等待 

  388.  ** 输入   :无 

  389.  ** 输出   :无 

  390.  ** 返回   :无 

  391.  ** 注意   :无 

  392. ***************************************************************/  

  393. u8 I2C_Standby(void)                                                     

  394. {  

  395. #if 0  

  396.     u16 i;  

  397.     u8 flag = 0;  

  398.       

  399.     i = 0;  

  400.     do  

  401.     {  

  402.         I2C_GenerateSTART(I2C1, ENABLE);//产生IIC1传输START条件  

  403.         I2C_Send7bitAddress(I2C1, FRAM_ADDR, I2C_Direction_Transmitter);//向FRAM发送地址  

  404.             i++;      

  405.             if(I2C_MAX_DEAD_TIME <= i)  

  406.             {  

  407.                 flag = 7;  

  408.                 break;  

  409.             }         

  410.     }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));//检测SR1第1位,查看地址是否发送完成  

  411.       

  412.     I2C_ClearFlag(I2C1, I2C_FLAG_AF); //清除应答错误标志位     

  413.     I2C_GenerateSTOP(I2C1, ENABLE);   //产生IIC传输STOP条件  

  414.       

  415.     return flag;  

  416. #else  

  417.   return 0x00;  

  418. #endif  

  419. }  


关键字:STM32  驱动FM24CL16 引用地址:STM32驱动FM24CL16

上一篇:对STM32系统时钟和分频的一点理解
下一篇:STM32学习笔记之复位后初始化变量非零方法

推荐阅读最新更新时间:2024-03-16 15:36

STM32-AHB、APB1、APB2的使(失)能函数
一、RCC_AHBPeriphClockCmd函数 其中RCC_AHBPeriph的取值范围: 二、RCC_APB2PeriphClockCmd函数 其中RCC_APB2Periph的取值范围:GPIOx 、高级定时器TIM1,TIM8,高速SPI1,高速异步通信USART1,ADC1,ADC2,ADC3,温度传感器等接口 三、RCC_APB1PeriphClockCmd函数: 其中RCC_APB1Periph的取值范围:备份接口,通用定时器,基本定时器,异步通信USART2,USART3,异步通信USART4,USART5,IIC1,IIC2,SPI2/IIS3,SPI3/IIS3 CAN总线,USB2,0,
[单片机]
STM32-AHB、APB1、APB2的使(失)能函数
stm32启动文件详解及SystemInit函数分析
;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 ;然后在RAM中分配变量使用的堆 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配 ;分配完成后,再定义和实现相应的中断函数, ;所有的中断函数全部带有 特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。 ;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称 ;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后, ;从0x0800_0000处取出栈顶地址存放于M
[单片机]
STM32——粗谈通信接口设备
在STM32中,其通信接口共有5个,分别是:用于IC间通信的SPI接口和I2C接口、用于控制局域网通信的CAN 总线接口、与PC通信的 USB接口、还有最常见的通用同步/异步串口USART。下面我们来详细介绍一下这5个通信接口在STM32中分别所起的作用。 1. 用于IC间通信的SPI接口 在STM32中,为了能够与其他 IC进行通信,其配备2个SPI接口,并提供高达18 MHz的全双工SPI通信。在这两个SPI接口上,其中有一个SPI设备接口是位于满速为72 MHz的APB2高速总线上,而另外一个SPI设备接口则是位于满速为36 MHz的APB1低速总线上。用户可以对每个 SPI 设备的时钟极性和相位进行定制,其发送数据
[单片机]
STM32-systick系统定时器
systick系统定时器 系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中 counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环 定时时间计算 t=reload*(1/clk) clk=72M时,t=72*(1/72m)=1us clk=72M时,t=72000*(1/72m)=1ms clk=72M时,t=72000000*(1/72m)=1s 1s=1000MS =1000 000US=1000 000 000NS sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个
[单片机]
STM32-systick系统定时器
STM32的FSMC仿真可运行
调试了几天STM32的FSMC驱动液晶的程序,原先在MDK上编译下载后可以运行的程序,移植到IAR上后就出现了问题,(以下描述的是在从新上电复位后运行的现象,但在jlink调试过程中运行都是正常的) 问题是这样的:程序运行完 *(__IO uint16_t *) (Bank1_LCD_C)= index; 后就不在往下运行了,反复实验了N次,只有一次进入了Hardfault, 而剩下的情况都是mcu不运行了。查了很多资料终于在一片《STM32F103 FSMC 同步模式 学习笔记2》文章中找到了答案,原因是在FSMC初始化过程中出现的,我们初学者编程序都有以个缺点,就是定义申请的变量后都不进行变量初始化操作(特别是定义了一些较为复
[单片机]
STM32 x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC控制器解决方案发布
01前言 随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,同时随着国内工业控制系统逐步进入中高端应用,更加精准的控制至关重要,因此工业控制系统高实时高性能需求尤其突出。 面对以上挑战,合作伙伴翌控科技基于米尔STM32MP135开发板发布开放式高实时高性能PLC控制器解决方案,将高精准数据采集、预处理、存储、通信与高实时控制融为一体,为控制系统迈向完全数字化中高端控制提供一个非常好的选择。 02STM32MP135处理器简介 STM32MP1
[嵌入式]
<font color='red'>STM32</font> x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC控制器解决方案发布
STM32程序跳转需要注意的问题
Note: keil生成的.axf或者.elf都是可以执行的镜像文件。 IAP - User Program 需要注意的问题 要设置好好中断向量的问题,假设User Program 开始地址是(0x08008000),那么中断向量就必须设在在0x08008000处,中断向量要设置program的开始的位置。 User Program到IAP主要是要设置好中断向量,跳转前要注意设置中断向量在IAP程序(0x08000000)的开始地方即(0x08000000)。还要关闭所有中断,如下操作: NVIC_SetVectorTable(0x08000000, 0x00); __disable_irq(); 问题:如果这样
[单片机]
STM32学习之路-LCD(2)
这些天一直在研究LCD的初始化函数,因为不过是用IO口模拟时序还是用FSMC来驱动LCD,都必须要弄好LCD的初始化 其实LCD的初始化就是跟着LCD IC的datasheet来写寄存器,大部分都使用上面的默认值,网上有很多修改的例子,这里就不 放出来了.但是我想写下一些比较重要的东西。 这是从网上下载来的一个文件的前半部分: 当然,别的型号的IC也是有这些东西的,不过可能有些地址不同而已. R0,这个命令有两个功能,如果对它写,则最低位为OSC,用于开启和关闭振荡器。而如果对它读操作, 则返回的是控制器的型号。这个命令最大的功能是通过读它可以得到控制器的型号,而我们的代码知道了控制器的型号之后, 可以针对不同型号的控制器
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved