打印
[STM32F1]

经过几天的努力,终于把I2C+CPAL搞定了,散分庆祝……

[复制链接]
5069|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cool_coder|  楼主 | 2014-8-8 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
除了阅读大量的ST官方文档,剩下的信息就基本来自这里了。感谢分享经验的兄弟们,等有时间我也来分享一些心得……
话说那个CPAL库还是不错的,虽有些小问题,总体上功能挺好,覆盖了I2C操作的所有模式,用软件弥补了硬件的不足,并且支持多任务并行操作,就是有点复杂,要舍得花时间搞定。先贴出来几段调试输出(semihost方式),看到这些就差不多成功了:
/////////////////////////////////////////////////////////
// Init.
LOG <CPAL_I2C_StructInit> : I2C Device Structure set to Default Value

LOG <CPAL_I2C_Init> : I2C Device Init
LOG : I2C Device Disabled
LOG : I2C Device IOs Deinit
LOG : I2C Device Clock Deinit
LOG : I2C Device DMA Deinit
LOG : I2C Device Clock Init
LOG : I2C Device IOs Init
LOG : I2C Device Enabled
LOG : I2C Device Config
LOG : I2C Device DMA Init
LOG : I2C Device IT Init
/////////////////////////////////////////////////////////
// Write one byte
: I2C Device Ready

LOG <CPAL_I2C_Write> : I2C Device Write OP
LOG : I2C Device Master
LOG : I2C Device DMA TX Enabled
LOG : I2C Device Ready TX
LOG : I2C Device Generates Start
LOG : I2C Device EVT IT Enabled

LOG <I2C_EV_IRQHandler> : I2C Device Master IT
LOG : I2C Device Start Acknowledged
LOG : I2C Device 7bit Address
LOG : I2C Device Busy TX
LOG : I2C Device Target Address Sent

LOG <CPAL_I2C_DMA_TX_IRQHandler> : I2C Device TX DMA
LOG : I2C Device TX Complete
/////////////////////////////////////////////////////////
// Read 3-byte
: I2C Device Master TX DMA Disabled

LOG <CPAL_I2C_Read> : I2C Device Perform Read OP
LOG : I2C Device Master No Memory Address Mode
LOG : I2C Device Ready RX
LOG : I2C Device Master
LOG : I2C Device Generates Start
LOG : I2C Device EVT IT Enabled

LOG <I2C_EV_IRQHandler> : I2C Device Master IT
LOG : I2C Device Start Acknowledged
LOG : I2C Device 7bit Address
LOG : I2C Device Busy RX
LOG : I2C Device Target Address Sent

LOG <CPAL_I2C_DMA_RX_IRQHandler> : I2C Device RX DMA
LOG : I2C Device RX Complete
沙发
cool_coder|  楼主 | 2014-8-8 16:51 | 只看该作者
本帖最后由 cool_coder 于 2014-8-8 16:53 编辑

记录些看过的贴子:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=652242
这个拼命贴不错,汇集了不少人的经验
https://bbs.21ic.com/forum.php?mod=viewthread&tid=223586

使用特权

评论回复
板凳
cnhemiya| | 2014-8-8 16:59 | 只看该作者
恭喜

使用特权

评论回复
地板
mmuuss586| | 2014-8-8 18:31 | 只看该作者

恭喜;

使用特权

评论回复
5
cool_coder|  楼主 | 2014-8-8 23:43 | 只看该作者
谢谢楼上的两位~ :handshake

使用特权

评论回复
6
xktesla| | 2015-8-5 23:32 | 只看该作者
楼主贴个源代码出来吧,简单的例子就行,给我们新手一些指引,万分感谢!!!
传附件也行,谢了!

使用特权

评论回复
7
cool_coder|  楼主 | 2015-8-7 16:25 | 只看该作者
xktesla 发表于 2015-8-5 23:32
楼主贴个源代码出来吧,简单的例子就行,给我们新手一些指引,万分感谢!!!
传附件也行,谢了! ...

CPAL库本身就是源码,自带范例。我觉得除了例子之外,关键还要理解库的内部操作,才能用得好。简单的库调用是这样的:
BOOLEAN Chip_Read(CPAL_DevTypeDef I2Cx, INT8U byChipAddr, INT8U byPtr, INT8U *pbyData, INT8U byLen)
{
        CPAL_InitTypeDef* pCPAL = I2C_DevStructures[I2Cx];
       
        pCPAL->CPAL_ProgModel = CPAL_PROGMODEL_DMA;       

        pCPAL->pCPAL_TransferRx = &(I2C_RxTransfer[I2Cx]);
       
        pCPAL->pCPAL_TransferRx->wNumData = (INT32U)byLen;
        pCPAL->pCPAL_TransferRx->pbBuffer = pbyData;
        pCPAL->pCPAL_TransferRx->wAddr1   = (INT32U)byChipAddr;
        pCPAL->pCPAL_TransferRx->wAddr2   = (INT32U)byPtr;
       
        if(CPAL_PASS != CPAL_I2C_Read(pCPAL)){
                return FALSE;
        }
        WaitForI2CReady(pCPAL);
        if(CPAL_STATE_ERROR == GetMyI2CState(I2Cx)){
                return FALSE;
        }
        return TRUE;
}

使用特权

评论回复
8
cool_coder|  楼主 | 2015-8-7 16:27 | 只看该作者
关于如何配置和使用CPAL,可以参考ST的官方文档,第四章详细描述了配置和使用方面的问题。
CD00291090_CPAL.pdf (518.99 KB)

使用特权

评论回复
9
啃啃坑吭| | 2015-8-7 16:43 | 只看该作者
看了,虽然不懂

使用特权

评论回复
10
mingjie99| | 2016-10-11 17:17 | 只看该作者
希望贴个源码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

1582

帖子

4

粉丝