搜索
bottom↓
回复: 14

发个无技术含量的STM32+MCP3421(AD芯片)代码,仅供新手参考~

  [复制链接]

出130入129汤圆

发表于 2016-11-30 12:49:31 | 显示全部楼层 |阅读模式
本帖最后由 68336016 于 2016-11-30 12:52 编辑

MCP3421是个模数转换芯片,最早我是看论坛老杨做的表头上用过,觉得挺不错的,刚好自己这次做板就用上了。
使用起来很简单,就是I2C总线而已,找个以前代码修修改改就行,所以没任何技术含量,仅供入门新手偷懒参考一下

修改文件开头的宏,将SCK,SDA引脚设置正确就行,我的STM32 48MHZ,模拟I2C时钟大概100KHZ。
调用MCP3421_Init()初始化,
调用MCP3421_WriteByte(u8 WriteAddr, u8 data)配置,
调用 MCP3421_ReadBytes(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)读取AD值。


  1. /*******************************************************************************
  2. * 文件名            : mcp3421.h
  3. * 作  者        :
  4. * 版  本        :
  5. * 日  期        : 2016-11-17
  6. * 描  述        : mcp3421函数
  7. *******************************************************************************/

  8. /* Define to prevent recursive inclusion -------------------------------------*/
  9. #ifndef __MCP3421_H
  10. #define __MCP3421_H

  11. /* Includes ------------------------------------------------------------------*/
  12. #include "stm32f10x_lib.h"
  13. /* Exported types ------------------------------------------------------------*/
  14. /* Exported variables --------------------------------------------------------*/
  15. /* Exported constants --------------------------------------------------------*/
  16. /* Exported macro ------------------------------------------------------------*/
  17. /* Exported functions ------------------------------------------------------- */
  18. void MCP3421_Init(void);
  19. void I2C_StartBit(void);
  20. void I2C_StopBit(void);
  21. void I2C_SendBit(u8);
  22. u8 I2C_SendByte(u8);
  23. u8 I2C_ReceiveBit(void);
  24. u8 I2C_ReceiveByte(u8);
  25. void I2C_Delay(u16);
  26. void I2C_Config(void);
  27. bool MCP3421_WriteByte(u8 WriteAddr, u8 data);
  28. bool MCP3421_ReadBytes(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead);
  29. #endif

  30. /*********************************END OF FILE*********************************/
复制代码

  1. /*******************************************************************************
  2. * 文件名            : mcp3421.c
  3. * 作  者        :
  4. * 版  本        :
  5. * 日  期        : 2016-11-17
  6. * 描  述        : mcp3421函数
  7. *******************************************************************************/

  8. /* Includes ------------------------------------------------------------------*/
  9. #include "mcp3421.h"
  10. #include "main.h"
  11. /* Private typedef -----------------------------------------------------------*/
  12. /* Private define ------------------------------------------------------------*/
  13. #define ACK         0
  14. #define        NACK 1

  15. #define I2C_PORT                                        GPIOB
  16. #define I2C_SCK                                                GPIO_Pin_6
  17. #define I2C_SDA                                                GPIO_Pin_7

  18. #define RCC_APB2Periph_I2C_PORT                RCC_APB2Periph_GPIOB

  19. #define I2C_SCK_H()                                        I2C_PORT->BSRR = I2C_SCK
  20. #define I2C_SCK_L()                                        I2C_PORT->BRR = I2C_SCK
  21. #define I2C_SDA_H()                                        I2C_PORT->BSRR = I2C_SDA
  22. #define I2C_SDA_L()                                        I2C_PORT->BRR = I2C_SDA

  23. #define I2C_SDA_PIN()                                I2C_PORT->IDR & I2C_SDA //读取引脚电平

  24. u8 g_mcp3421AddressByte = 0x68;

  25. /* Private macro -------------------------------------------------------------*/
  26. /* Private variables ---------------------------------------------------------*/

  27. /*******************************************************************************
  28. * Function Name  : I2C_StartBit
  29. * Description    : 开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号
  30. * Input          : None
  31. * Output         : None
  32. * Return         : None
  33. *******************************************************************************/
  34. void I2C_StartBit(void)
  35. {
  36.     I2C_SDA_H();
  37.     I2C_Delay(5);
  38.     I2C_SCK_H();
  39.     I2C_Delay(5);
  40.     I2C_SDA_L();
  41.     I2C_Delay(5);
  42.     I2C_SCK_L();
  43.     I2C_Delay(5);
  44. }

  45. /*******************************************************************************
  46. * Function Name  : I2C_StopBit
  47. * Description    : 停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号
  48. * Input          : None
  49. * Output         : None
  50. * Return         : None
  51. *******************************************************************************/
  52. void I2C_StopBit(void)
  53. {
  54.     I2C_SCK_L();
  55.     I2C_Delay(5);
  56.     I2C_SDA_L();
  57.     I2C_Delay(5);
  58.     I2C_SCK_H();
  59.     I2C_Delay(5);
  60.     I2C_SDA_H();
  61.     I2C_Delay(5);
  62. }

  63. /*******************************************************************************
  64. * Function Name  : I2C_SendBit
  65. * Description    : Send a bit on I2C 82.5kHz
  66. * Input          : bit_out
  67. * Output         : None
  68. * Return         : None
  69. *******************************************************************************/
  70. void I2C_SendBit(u8 bit_out)
  71. {
  72.     if(bit_out == 0)
  73.     {
  74.         I2C_SDA_L();
  75.     }
  76.     else
  77.     {
  78.         I2C_SDA_H();
  79.     }

  80.     I2C_Delay(2);
  81.     I2C_SCK_H();
  82.     I2C_Delay(6);
  83.     I2C_SCK_L();
  84.     I2C_Delay(2);
  85. }

  86. /*******************************************************************************
  87. * Function Name  : I2C_SendByte
  88. * Description    : Send a byte on I2C
  89. * Input          : Tx_buffer
  90. * Output         : None
  91. * Return         : None
  92. *******************************************************************************/
  93. u8 I2C_SendByte(u8 Tx_buffer)
  94. {
  95.     u8        Bit_counter;
  96.     u8        Ack_bit;

  97.     for(Bit_counter = 8; Bit_counter; Bit_counter--)
  98.     {
  99.         if(Tx_buffer & 0x80)
  100.         {
  101.             I2C_SendBit(1);
  102.         }
  103.         else
  104.         {
  105.             I2C_SendBit(0);
  106.         }

  107.         Tx_buffer <<= 1;                                // Get next bit for checking
  108.     }

  109.     Ack_bit = I2C_ReceiveBit();                // Get acknowledgment bit
  110.     return        Ack_bit; //0有应答,1无应答
  111. }

  112. /*******************************************************************************
  113. * Function Name  : I2C_ReceiveBit
  114. * Description    : Receive a bit on I2C
  115. * Input          : None
  116. * Output         : None
  117. * Return         : Ack_bit
  118. *******************************************************************************/
  119. u8 I2C_ReceiveBit(void)
  120. {
  121.     u8 Ack_bit;

  122.     I2C_SDA_H();          //引脚靠外部电阻上拉,当作输入
  123.     I2C_Delay(2);                        // High Level of Clock Pulse
  124.     I2C_SCK_H();                        // Set SCL line
  125.     I2C_Delay(4);                        // High Level of Clock Pulse

  126.     if(I2C_SDA_PIN())
  127.     {
  128.         Ack_bit = 1;
  129.     }
  130.     else
  131.     {
  132.         Ack_bit = 0;
  133.     }

  134.     I2C_SCK_L();                        // Clear SCL line
  135.     I2C_Delay(2);                        // Low Level of Clock Pulse

  136.     return        Ack_bit;
  137. }

  138. /*******************************************************************************
  139. * Function Name  : I2C_ReceiveByte
  140. * Description    : Receive a byte on I2C
  141. * Input          : ack_nack
  142. * Output         : None
  143. * Return         : RX_buffer
  144. *******************************************************************************/
  145. u8 I2C_ReceiveByte(u8 ack_nack)
  146. {
  147.     u8         RX_buffer;
  148.     u8        Bit_Counter;

  149.     for(Bit_Counter = 8; Bit_Counter; Bit_Counter--)
  150.     {
  151.         if(I2C_ReceiveBit())                        // Get a bit from the SDA line
  152.         {
  153.             RX_buffer <<= 1;                        // If the bit is HIGH save 1  in RX_buffer
  154.             RX_buffer |= 0x01;
  155.         }
  156.         else
  157.         {
  158.             RX_buffer <<= 1;                        // If the bit is LOW save 0 in RX_buffer
  159.             RX_buffer &= 0xfe;
  160.         }
  161.     }

  162.     I2C_SendBit(ack_nack);                        //0收到,1没收到
  163.     return RX_buffer;
  164. }

  165. /*******************************************************************************
  166. * Function Name  : I2C_Delay
  167. * Description    : 延时  一次循环约1us
  168. * Input          : time
  169. * Output         : None
  170. * Return         : None
  171. *******************************************************************************/
  172. void I2C_Delay(u16 time)
  173. {
  174.     u16 i, j;

  175.     for(i = 0; i < 4; i++)
  176.     {
  177.         for(j = 0; j < time; j++);
  178.     }
  179. }

  180. /*******************************************************************************
  181. * Function Name  : I2C_Config
  182. * Description    : I2C初始化
  183. * Input          : None
  184. * Output         : None
  185. * Return         : None
  186. *******************************************************************************/
  187. void I2C_Config()
  188. {
  189.     GPIO_InitTypeDef    GPIO_InitStructure;

  190.     /* Enable I2C_PORT clocks */
  191.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_I2C_PORT, ENABLE);

  192.     /*配置I2C_SCK、I2C_SDA为集电极开漏输出*/
  193.     GPIO_InitStructure.GPIO_Pin = I2C_SCK | I2C_SDA;
  194.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  195.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  196.     GPIO_Init(I2C_PORT, &GPIO_InitStructure);

  197.     I2C_SCK_H();
  198.     I2C_SDA_H();
  199. }

  200. /*******************************************************************************
  201. * Function Name  : MCP3421_Init
  202. * Description    : MCP3421初始化
  203. * Input          : None
  204. * Output         : None
  205. * Return         : None
  206. *******************************************************************************/
  207. void MCP3421_Init()
  208. {
  209.     I2C_Config();
  210. }

  211. /*******************************************************************************
  212. * Function Name  : MCP3421_WriteByte
  213. * Description    : I2C
  214. * Input          : WriteAddr, data
  215. * Output         : None
  216. * Return         : bool       1001 1100 = 0x9c
  217. *******************************************************************************/
  218. bool MCP3421_WriteByte(u8 WriteAddr, u8 data)
  219. {
  220.     I2C_StartBit();

  221.     if(I2C_SendByte(WriteAddr << 1))
  222.     {
  223.         I2C_StopBit();
  224.         return FALSE;
  225.     }

  226.     I2C_SendByte(data);
  227.     I2C_StopBit();
  228.     return TRUE;
  229. }

  230. /*******************************************************************************
  231. * Function Name  : MCP3421_ReadBytes
  232. * Description    : 连续读取
  233. * Input          : ReadAddr, NumByteToRead
  234. * Output         : pBuffer
  235. * Return         : bool
  236. *******************************************************************************/
  237. bool MCP3421_ReadBytes(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
  238. {
  239.     I2C_StartBit();

  240.     if(I2C_SendByte((ReadAddr << 1) | 0x01))
  241.     {
  242.         I2C_StopBit();
  243.         return FALSE;
  244.     }

  245.     while(NumByteToRead)
  246.     {
  247.         if(NumByteToRead == 1)
  248.         {
  249.             *pBuffer = I2C_ReceiveByte(NACK); //最后一个字节用NO ACK
  250.         }
  251.         else
  252.         {
  253.             *pBuffer = I2C_ReceiveByte(ACK);
  254.         }

  255.         pBuffer++;
  256.         NumByteToRead--;
  257.     }

  258.     I2C_StopBit();
  259.     return TRUE;
  260. }

  261. /*********************************END OF FILE*********************************/
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-30 13:52:05 | 显示全部楼层
问一下,价格是多少钱?

出20入186汤圆

发表于 2016-11-30 13:53:42 | 显示全部楼层
STM32没有硬件I2C么?要这么搞?这,,,,,

出130入129汤圆

 楼主| 发表于 2016-11-30 14:03:45 来自手机 | 显示全部楼层
Excellence 发表于 2016-11-30 13:52
问一下,价格是多少钱?

jlc有卖,我忘记价格了

出130入129汤圆

 楼主| 发表于 2016-11-30 14:05:09 来自手机 | 显示全部楼层
yuyu87 发表于 2016-11-30 13:53
STM32没有硬件I2C么?要这么搞?这,,,,,

自带的你确定好用?
模拟的省事

出0入4汤圆

发表于 2016-11-30 14:05:36 | 显示全部楼层
刚好最近也选了这个。

之前用ads1110  是16bit的 和这个pin to pin的

出20入186汤圆

发表于 2016-11-30 14:41:05 | 显示全部楼层
68336016 发表于 2016-11-30 14:05
自带的你确定好用?
模拟的省事

不好用人家干嘛带硬件I2C?

出0入0汤圆

发表于 2018-12-1 18:05:14 | 显示全部楼层
模数转换芯片

出0入0汤圆

发表于 2019-2-19 14:51:47 | 显示全部楼层
MCP342X系列芯片吊打其他ADC

出0入0汤圆

发表于 2019-2-19 19:49:25 来自手机 | 显示全部楼层
感谢楼主分享

出0入135汤圆

发表于 2019-2-19 21:10:15 来自手机 | 显示全部楼层
mcp3421 adc多少钱一片

出0入135汤圆

发表于 2019-2-19 21:12:45 来自手机 | 显示全部楼层
刚看了一下,批量5.8,还算不错

出0入0汤圆

发表于 2019-2-19 21:26:10 来自手机 | 显示全部楼层
留个记号。

出0入0汤圆

发表于 2019-2-19 22:27:04 来自手机 | 显示全部楼层
最近也要用这个,准备用硬件IIC

出0入0汤圆

发表于 2019-4-10 13:41:40 | 显示全部楼层
mark,谢谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 11:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表