完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
可不可以直接用i2c向外面按照协议格式一直发数据,需要有什么方面的配置。为什么我的配置之后只能发送地址信息,然后就结束了。。。。。小白求帮助。
/* Includes ------------------------------------------------------------------*/ #include "main.h" /** @addtogroup Template_Project * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ static __IO uint32_t TimingDelay; RCC_ClocksTypeDef RCC_Clocks; __IO uint16_t sEEAddress = 0x44; //__IO uint32_t sEETimeout = sEE_LONG_TIMEOUT; __IO uint16_t sEEDataNum; __IO uint32_t sEETimeout; __IO uint32_t sEETrials = 0; #define sEE_WRITE_ADDRESS1 0x00 #define sEE_READ_ADDRESS1 0x00 #define BUFFER_SIZE1 256 #define BUFFER_SIZE2 256 #define sEE_WRITE_ADDRESS2 (sEE_WRITE_ADDRESS1 + BUFFER_SIZE1) #define sEE_READ_ADDRESS2 (sEE_READ_ADDRESS1 + BUFFER_SIZE1) //状态变量 typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; /* Private functions ---------------------------------------------------------*/ /** * @brief Main program. * @param None * @retval None */ void main(void) { uint8_t senddata=0xa0; GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStruct; // 配置I2C始终资源 RCC_I2CCLKConfig(RCC_I2C1CLK_HSI); //GPIO使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //IIC使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //GPIO管脚配置 GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5; GPIO_Init(GPIOB,&GPIO_InitStructure); /* I2C configuration */ I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_InitStruct.I2C_DigitalFilter = 0x00; I2C_InitStruct.I2C_OwnAddress1 =0x00; // I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_InitStruct.I2C_Ack = I2C_Ack_Disable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_Timing =0x00210507;//100Kbits I2C_Init(I2C1, &I2C_InitStruct); //I2C_SMBusAlertCmd(I2C1,ENABLE); I2C_Cmd(I2C1, ENABLE); while(1) { I2C_TransferHandling(I2C1, sEEAddress, 2, I2C_Reload_Mode, I2C_Generate_Start_Write); I2C_SendData(I2C1,senddata); } } /** * @brief Inserts a delay time. * @param nTime: specifies the delay time length, in 10 ms. * @retval None */ void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } /** * @brief Decrements the TimingDelay variable. * @param None * @retval None */ void TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
|
相关推荐
21个回答
|
|
|
没有指明发送数据的数量
|
|
|
|
|
|
|
|
|
|
|
|
我看了库函数就头晕,给你发个我的代码
|
|
|
|
|
|
void
I2C_Master_Transmit(uint8_t DevAddress, uint8_t eerom_start_address, const uint8_t * pData, uint16_t Size ) { uint32_t sizetmp; if ((pData == NULL) || (Size == 0)) { return; } while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY)) { } /* Send Slave Address */ /* Set NBYTES to write and reload if size > I2C_MAX_BYTES and generate RESTART */ /* Size > I2C_MAX_BYTES, need to set RELOAD bit */ if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_GENERATE_START_WRITE); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE); sizetmp = Size; } while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { } I2C_CHANNEL->TXDR = eerom_start_address; while ((Size - 1) > 0) { /* Wait until TXIS flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { } /* Write data to TXDR */ I2C_CHANNEL->TXDR = (uint32_t)*pData; pData++; sizetmp--; Size--; if ((sizetmp == 0) && (Size != 0)) { /* Wait until TXE flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TCR)) { } if (Size > I2C_MAX_BYTES) { I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_NO_STARTSTOP); sizetmp = I2C_MAX_BYTES; } else { I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP); sizetmp = Size; } } } /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ /* Wait until STOPF flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_STOPF)) { } /* Clear STOP Flag */ __HAL_I2C_CLEAR_FLAG(I2C_ISR_STOPF); /* Clear Configuration Register 2 */ __HAL_I2C_RESET_CR2(); } |
|
|
|
|
|
void
I2C_TransferConfig(uint8_t DevAddress, uint16_t Size, uint32_t Mode, uint32_t Request ) { /* clear tmpreg specific bits */ I2C_CHANNEL->CR2 &= (uint32_t) ~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)); /* update tmpreg */ #if I2C_ADDRESSINGMODE_7BIT I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)(DevAddress << 1) & I2C_CR2_SADD) | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) | (uint32_t)Mode | (uint32_t)Request); #else I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) | (uint32_t)Mode | (uint32_t)Request); #endif } |
|
|
|
|
|
你参考看看
|
|
|
|
|
nyvvhxcs 发表于 2018-9-25 12:02 谢谢了,我研究研究 |
|
|
|
|
nyvvhxcs 发表于 2018-9-25 12:02 大神,我还想请教你个问题,就是如果我只将stm板子,作为主机,不给其链接从设备,那样就没有反馈的ack信号,那么在地址信息发出之后主机没有得到ack那么他就不会再向从设备发送数据信息,如何通过软件的形式给主机提供反馈的ack信号?大神在帮帮忙 |
|
|
|
|
|
你的I2C定义那里把应答关掉了,没了应答,怎么连续发数据?
|
|
|
|
|
|
因为我不打算给其提供从设备,所以担心应答会导致其不再进行数据发送,所以我将其关掉。我比较小白,因为我一直存在一个问题就是按照i2c的协议,主设备在发送地址信息之后需要从设备的反馈个ack信息,然后在进行数据传输。然而我的从设备并没有提供,也就是没有这个反馈的ack信号提供。本来是想以后添加从设备,现在想想把这个主设备完全驱动出来,您有什么意见吗? |
|
|
|
|
60user82 发表于 2018-9-25 12:47 不连从设备你怎么发数据 |
|
|
|
|
|
|
|
|
|
|
|
不可以直接用主设备一直发数据出去吗?因为从设备还没到手,我现在想用主设备一直持续的发数据出去 |
|
|
|
|
|
ST的I2C还是直接用模拟吧.....硬件坑爹...
|
|
|
|
|
|
|
|
|
|
|
|
我也见过野火有说I2C不稳定,用GPIO模拟实现。野火实验板有例子下载。
|
|
|
|
|
|
学习学习
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:45 , Processed in 2.069881 second(s), Total 110, Slave 93 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1570